当前位置:  编程技术>php

php过滤函数trim实现原理

    来源: 互联网  发布时间:2014-08-30

    本文导语:  本节内容: php trim函数的原理剖析   代码示例: static inline int php_charmask(unsigned char *input, int len, char *mask TSRMLS_DC) {  unsigned char *end;  unsigned char c;  int result = SUCCESS;  memset(mask, 0, 256);  for (end = input+len; input < end; input++) {  ...

本节内容:
php trim函数的原理剖析
 

代码示例:

static inline int php_charmask(unsigned char *input, int len, char *mask TSRMLS_DC)
{
 unsigned char *end;
 unsigned char c;
 int result = SUCCESS;

 memset(mask, 0, 256);
 for (end = input+len; input < end; input++) {
  c=*input;
  if ((input+3 < end) && input[1] == '.' && input[2] == '.'
    && input[3] >= c) {
   memset(mask+c, 1, input[3] - c + 1);
   input+=3;
  } else if ((input+1 < end) && input[0] == '.' && input[1] == '.') {
   /* Error, try to be as helpful as possible:
      (a range ending/starting with '.' won't be captured here) */
   if (end-len >= input) { /* there was no 'left' char */
    php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid '..'-range, no character to the left of '..'");
    result = FAILURE;
    continue;
   }
   if (input+2 >= end) { /* there is no 'right' char */
    php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid '..'-range, no character to the right of '..'");
    result = FAILURE;
    continue;
   }
   if (input[-1] > input[2]) { /* wrong order */
    php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid '..'-range, '..'-range needs to be incrementing");
    result = FAILURE;
    continue;
   }
   /* FIXME: better error (a..b..c is the only left possibility?) */
   php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid '..'-range");
   result = FAILURE;
   continue;
  } else {
   mask[c]=1;
  }
 }
 return result;
}
/* }}} */

/* {{{ php_trim()
 * mode 1 : trim left
 * mode 2 : trim right
 * mode 3 : trim left and right
 * what indicates which chars are to be trimmed. NULL->default (' tnrv')
 */
PHPAPI char *php_trim(char *c, int len, char *what, int what_len, zval *return_value, int mode TSRMLS_DC)
{
 register int i;
 int trimmed = 0;
 char mask[256];

 if (what) {
  php_charmask((unsigned char*)what, what_len, mask TSRMLS_CC);
 } else {
  php_charmask((unsigned char*)" nrtv", 6, mask TSRMLS_CC);
 }

 if (mode & 1) {
  for (i = 0; i < len; i++) {
   if (mask[(unsigned char)c[i]]) {
    trimmed++;
   } else {
    break;
   }
  }
  len -= trimmed;
  c += trimmed;
 }
 if (mode & 2) {
  for (i = len - 1; i >= 0; i--) {
   if (mask[(unsigned char)c[i]]) {
    len--;
   } else {
    break;
   }
  }
 }

 if (return_value) {
  RETVAL_STRINGL(c, len, 1);
 } else {
  return estrndup(c, len);
 }
 return "";
}
/* }}} */

/* {{{ php_do_trim
 * Base for trim(), rtrim() and ltrim() functions.
 */
static void php_do_trim(INTERNAL_FUNCTION_PARAMETERS, int mode)
{
 char *str;
 char *what = NULL;
 int str_len, what_len = 0;
 
 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s", &str, &str_len, &what, &what_len) == FAILURE) {
  return;
 }
 
 php_trim(str, str_len, what, what_len, return_value, mode TSRMLS_CC);
}
/* }}} */

/* {{{ proto string trim(string str [, string character_mask])
   Strips whitespace from the beginning and end of a string */
PHP_FUNCTION(trim)
{
 php_do_trim(INTERNAL_FUNCTION_PARAM_PASSTHRU, 3);
}
/* }}} */

/* {{{ proto string rtrim(string str [, string character_mask])
   Removes trailing whitespace */
PHP_FUNCTION(rtrim)
{
 php_do_trim(INTERNAL_FUNCTION_PARAM_PASSTHRU, 2);
}
/* }}} */

/* {{{ proto string ltrim(string str [, string character_mask])
   Strips whitespace from the beginning of a string */
PHP_FUNCTION(ltrim)
{
 php_do_trim(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
}
/* }}} */


    
 
 

您可能感兴趣的文章:

  • PHP的substr() 函数用法
  • php构造函数与析构函数
  • php中检测变量是否是一个对象的is_object函数介绍及用法举例
  • php构造函数与析构函数初探
  • php session_id()函数介绍及代码实例
  • PHP中的Pack()函数,Java有哪个函数与之对应???
  • php中session_id()函数详细介绍,会话id生成过程及session id长度
  • php构造函数与析构函数 php内存管理函数
  • php将html特殊字符转换成html字符串的函数:htmlspecialchars()介绍及代码举例
  • php数组函数之array_combine() 数组合并函数
  • php使用socket_bind()函数绑定IP地址
  • php构造函数和析构函数学习
  • php将unix时间戳转换成字符串时间函数(date)
  • php trim函数执行过程解析
  • php通过pack和unpack函数实现对二进制数据封装及解析
  • php递归函数小例子
  • php时间格式化函数date介绍及用法参考
  • php sprintf函数用法 php浮点数格式
  • php递归示例 php递归函数代码
  • php构造函数与析构函数实例分析
  • 在php中如何用exec()函数运行mv命令
  • php 过滤英文标点符号及过滤中文标点符号代码
  • PHP的HTML内容过滤脚本 htmLawed
  • php过滤html中网站链接 php实现域名白名单功能
  • PHP 过滤库 Filterus
  • PHP中HTML标签过滤技巧
  • PHP过滤★等特殊符号的正则
  • php正则过滤特殊字符的方法
  • php过滤敏感词的示例
  • php小技巧之过滤ascii控制字符
  • php字符串过滤与转换函数有哪些
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • php获取访客ip地址原理及提供七段代码供参考
  • php 生成短网址原理及代码
  • php session 原理详解,用法介绍以及如何设置过期时间
  • php生成短网址原理与实例
  • PHP批量生成静态HTML的简单原理和方法
  • PHP中的插件机制原理和实例
  • apache与php工作原理分析
  • PHP的MVC模式实现原理分析(一相简单的MVC框架范例)
  • php如何防范sql注入攻击 sql注入原理解析
  • WEB前端 iis7站长之家
  • 修改配置真正解决php文件上传大小限制问题(nginx+php)
  • IIS7配置PHP图解(IIS7+PHP_5.2.17/PHP_5.3.5)
  • PHP 5.4.19 和 PHP 5.5.3 发布及下载地址
  • php输入流php://input使用示例(php发送图片流到服务器)
  • 修改配置真正解决php文件上传大小限制问题(apache+php)
  • PHP转换器 HipHop for PHP
  • PHP去除html标签,php标记及css样式代码参考
  • PHP 框架 Pop php
  • PHP 'ext/soap/php_xml.c'不完整修复存在多个任意文件泄露漏洞
  • PHP的JavaScript框架 PHP.JS
  • php通过socket_bind()设置IP地址代码示例
  • php服务器探针显示php服务器信息
  • php安装完成后如何添加mysql扩展
  • PHP缓存加速器 Alternative PHP Cache (APC)
  • PHP介绍及学习网站推荐
  • PHP源文件加密工具 PHP Screw
  • php中操作memcache的类及成员列表及php下如何连接memched服务器
  • PHP自动化测试 PHP-QAT
  • php中内置的mysql数据库连接驱动mysqlnd简介及mysqlnd的配置安装方式
  • PHP 的 HTTP 客户端库 PHP Buzz
  • php将标准字符串格式时间转换成unix时间戳_strtotime


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3