资讯专栏INFORMATION COLUMN

[PHP源码阅读]trim、rtrim、ltrim函数

时飞 / 3111人阅读

摘要:系列函数是用于去除字符串中首尾的空格或其他字符。此处要注意,左右两边是一对合法的范围值,如果传递的是非法的值会报错。本文主要对函数进行分析,和函数跟的类似。更多源码文章源码阅读函数性能为王从源码剖析和源码阅读和函数源码阅读和函数

trim系列函数是用于去除字符串中首尾的空格或其他字符。ltrim函数只去除掉字符串首部的字符,rtrim函数只去除字符串尾部的字符。

我在github有对PHP源码更详细的注解。感兴趣的可以围观一下,给个star。PHP5.4源码注解。可以通过commit记录查看已添加的注解。

trim
string trim ( string $str [, string $character_mask = " 	

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内部使用的是与运算,而不是多个的判断条件。该部分代码如下:

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;
        }
    }
}

判断的过程:

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源码文章:

[PHP源码阅读]strlen函数

【性能为王】从PHP源码剖析array_keys和array_unique

[PHP源码阅读]strpos、strstr和stripos、stristr函数

【PHP源码阅读】explode和implode函数

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21601.html

相关文章

  • PHP 源码探秘 - 为什么 trim 会导致乱码

    摘要:我的博客运行以下代码互联网产品我们可能以为会得到的结果是互联网产品,实际结果是互联网产。所以在执行的时候,通过字节比对,会将去掉,导致了最后出现了乱码。 我的博客 https://mengkang.net/1039.html 运行以下代码: $tag = 互联网产品、; $text = rtrim($tag, 、); print_r($text); 我们可能以为会得到的结果是互联网产品...

    xbynet 评论0 收藏0
  • 关于php trim方法的错误理解导致的问题

    摘要:场景中的截取字符串前后字符包括有三个方法下面的例子中只以方法做举例在我之前的认知中当然我很水,从没看过这块源码,如果我想要删除字符串左边的空字符串,空制表符之类的,那么我就直接使用即可如果我想要删除指定字符的时候,比如说现在有个字符串,我要 场景 php中的截取字符串前后字符包括有:ltrim,rtrim,trim三个方法 下面的例子中只以ltrim方法做举例在我之前的认知中(当然我很...

    Forest10 评论0 收藏0
  • PHP字符串操作

    摘要:字符串变量被解析。很显然,代表,代表获取字符串的长度对于英文数字字母。你好,截取字符串对于纯英文字符,可以使用对于中文字符,可以使用例如你好,世界查找字符串查找字符串,有内置函数代表,应该代表。当然也有函数用于处理其他编码的字符串。 1. 单引号和双引号 PHP可以在单引号或者双引号中包含字符串。但是单引号和双引号有所区别。 单引号包含的内容会被认为是普通字符串 双引号中允许包含字符...

    taoszu 评论0 收藏0
  • Php常用函数系列之字符串处理

    摘要:规定要检查的字符串。遇到这种情况时可以使用函数进行检测。输出反引用一个引用字符串函数示例反引用一个引用字符串输出连接分割字符串使用一个字符串分割另一个字符串边界上的分隔字符。应使用运算符来测试返回值函数示例输出返回字符串的子串输入字符串。 转自我的github函数示例源码 字符串的格式化 rtrim(),除字符串右端的空白字符或其他预定义字符 ltrim(),删除字符串开头空格或...

    陆斌 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<