trim系列函数用于删除字符串中前后的空格和其他字符。 ltrim函数仅删除字符串的第一个字符,而rtrim函数仅删除字符串末尾的字符。
我在github上有关于PHP源代码的更详细的注释。 感兴趣的人请看看周围,给star。 PHP5.4源代码注释。 您可以在commit记录中查看添加的注释。
修剪
stringtrim(string$str (,string $ character _ mask='tnr x0b ' ) )
参数说明
character_mask
缺省值为空白字符,如' tnr0x0B '。
.可以指定范围的字符。 请注意“.”的左右两侧有一对合法的范围值,如果传递了不正确的值,则会报告错误。
执行示例
首先来看看正常的使用方法:
$str='hello . ';
$new_str=trim($str,'.'; //结果是hello
是奇怪的结果。 这里报告错误是因为,php将.的左右视为范围值,其中“.”的左侧为字符“.”,在php内部视为缺少右边界的范围值。
$str='hello . ';
$second_str=Trim($str,'.'; //报告错误
第二个参数使用有效的边界值。
$str='helloabcdefg ';
$new_str=trim($str,' a.g ); //输出hello
trim执行步骤
trim、ltrim和rtrim这三个函数都是调用php_do_trim函数的,不同之处在于第二个参数mode。 本文主要对trim函数进行分析,ltrim和rtrim函数与trim相似。 而且,php_do_trim调用php_trim来实现功能,所以在trim函数的核心函数的情况下是php_trim函数。 执行步骤如下。
1、根据what的值设置保存过滤器字符的mask数组
2 .过滤字符串开头的要过滤的字符
3、过滤字符串末尾的过滤对象字符
php_trim函数执行的流程图如下。
解读源代码
php_trim函数先调用了php_charmask。 此函数尝试将过滤器字符设置为mask[char]=1的形式。 这是一个散列数组,可用于以后的判断。 如果第二个参数是范围值,则调用memset函数以向mask数组赋值。
使用mode变量确定要过滤的内容时,这里有一个小的优化。 PHP内部使用and运算,而不是多个判断条件。 部分代码如下所示。
if (模式1 ) {
for(I=0; i len; I ) {
if(mask((unsignedchar ) c(I ) ) ) )
trimmed
} else {
布雷克;
}
}
len -=trimmed;
c =trimmed;
}
if (模式2 ) {
for(I=Len-1; i=0; I----) {
if(mask((unsignedchar ) c(I ) ) ) )
len----;
} else {
布雷克;
}
}
}
判断的过程:
1 1==1左需要过滤
2 1==0左边不需要过滤
3 1==1左需要过滤
1 2==0右边不需要过滤
2 2==1右边需要过滤
3 2==1右边需要过滤
以这种方式使用位操作可以提高程序效率,使代码更简洁、更易读。
总结
阅读此函数的源代码,首先了解到在C语言中,如果需要创建键值对数组,并且键值为单个字符,则可以使用unsigned char类型创建数组下标,从而可以构建以类似字符为下标的映射数组
二是通过使用位运算来提高程序的效率和代码的可读性。
原创文章,文章有限,初浅学,文章如有不正之风,万望告知。
如果这篇文章有用的话,请点击推荐。 谢谢^_^
最后再安利一次吧。 我在github上有关于PHP源代码的更详细的注释。 感兴趣的人请看看周围,给star。 PHP5.4源代码注释。 您可以在commit记录中查看添加的注释。
添加PHP源文章: