trim
string trim ( string $str [, string $character_mask = \"大众 tnrx0B\公众 ] )
参数解释

character_mask 默认是” tnrx0B”等空缺字符。
利用..可以指定一段范围的字符。此处要把稳,”..”旁边两边是一对合法的范围值,如果通报的是非法的值会报错。
运行示例
先来看看用正常的利用
$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内部利用的是与运算,而不是多个的判断条件。该部分代码如下:
if(mode & 1){
for(i = 0;i < len;i++){
if(mask[(unsignedchar)c[i]]){
trimmed++;
}else{
break;
}
}
len -= trimmed;
c += trimmed;
}
if(mode & 2){
for(i = len - 1;i >= 0;i--){
if(mask[(unsignedchar)c[i]]){
len--;
}else{
break;
}
}
}
判断的过程:
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记录查看已添加的表明。