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

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

trim

string trim ( string $str [, string $character_mask = " \t\n\r\0\x0B" ] )

参数说明

character_mask
默认是" \t\n\r\0\x0B"等空白字符。

使用..可以指定一段范围的字符。此处要注意,".."左右两边是一对合法的范围值,如果传递的是非法的值会报错。

运行示例

先来看看用正常的使用:

$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记录查看已添加的注解。

更多源码文章,欢迎访问个人主页继续查阅:hoohack

转载于:https://www.cnblogs.com/hoohack/p/5520343.html

[PHP源码阅读]trim、rtrim、ltrim函数相关推荐

  1. trim函数 php,[PHP源码阅读]trim、rtrim、ltrim函数

    trim系列函数是用于去除字符串中首尾的空格或其他字符.ltrim函数只去除掉字符串首部的字符,rtrim函数只去除字符串尾部的字符. 我在github有对PHP源码更详细的注解.感兴趣的可以围观一下 ...

  2. nginx源码阅读(二).初始化:main函数及ngx_init_cycle函数

    前言 在分析源码时,我们可以先把握主干,然后其他部分再挨个分析就行了.接下来我们先看看nginx的main函数干了些什么. main函数 这里先介绍一些下面会遇到的变量类型: ngx_int_t: t ...

  3. php函数阅读,[PHP源码阅读]strtolower和strtoupper函数

    字符串的操作函数中,字符串的大小写转换也算是比较常用的函数,其底层实现也比较简单,下面来一探究竟. 我在github上有对PHP源码更详细的注解.感兴趣的可以围观一下,给个star. PHP5.4源码 ...

  4. [PHP源码阅读]strtolower和strtoupper函数

    字符串的操作函数中,字符串的大小写转换也算是比较常用的函数,其底层实现也比较简单,下面来一探究竟. 我在github上有对PHP源码更详细的注解.感兴趣的可以围观一下,给个star.PHP5.4源码注 ...

  5. CI框架源码阅读笔记4 引导文件CodeIgniter.php

    到了这里,终于进入CI框架的核心了.既然是"引导"文件,那么就是对用户的请求.参数等做相应的导向,让用户请求和数据流按照正确的线路各就各位.例如,用户的请求url: http:// ...

  6. 阅读react-redux源码(二) - createConnect、match函数的实现

    阅读react-redux源码 - 零 阅读react-redux源码 - 一 阅读react-redux源码(二) - createConnect.match函数的实现 上一节看了Provider组 ...

  7. wrappers.php,PHP源码阅读笔记六:stream_get_wrappers函数

    PHP源码阅读笔记stream_get_wrappers函数 stream_get_wrappers (PHP 5) stream_get_wrappers - 返回注册的数据流列表 Descript ...

  8. Soul网关源码阅读(八)路由匹配初探

    Soul网关源码阅读(八)路由匹配初探 简介      今日看看路由的匹配相关代码,查看HTTP的DividePlugin匹配 示例运行      使用HTTP的示例,运行Soul-Admin,Sou ...

  9. Android源码阅读---init进程

    Android源码阅读-init进程 文章目录 Android源码阅读---init进程 1. 编译命令和进程入口 1. init 进程编译命令 2. main函数流程 2. 主函数处理流程 1. 创 ...

最新文章

  1. 中国高校生物信息学中心有哪些
  2. 常见的java内存溢出情况
  3. 使用sublime text2怎样新建文件高速生成HTML头部信息?
  4. java:十进制转十六进制
  5. 流传在程序员中的传说,你知道几个?
  6. android 抽屉侧滑冲突,利用DrawerLayout和触摸事件分发实现抽屉侧滑效果
  7. 斐波那契数列的性质整理
  8. 学会这2招,不用设计师,一样能做出精美炫酷的可视化大屏模板
  9. 【算法笔记+SGU275+HDU3949】线性基(XOR,求n个数异或得到的第k小的数)
  10. 【小程序项目开发 -- 京东商城】uni-app 商品分类页面(下)
  11. 造移动厕所的,转做核酸采样亭。火了
  12. Win11磁盘碎片整理在哪?Win11机械硬盘磁盘碎片整理方法
  13. cisco 防火墙模拟器_37、如果手头有华为AP,怎们配合模拟器做部分实验呢?(完结篇)...
  14. Introspector
  15. android利用EpMedia给录像添加时间水印
  16. 如何用百度离线API调用百度离线地图
  17. matlab曲线拟合工具箱cftool
  18. 12.8 创建空白图片
  19. 乐高式微服务化改造(下)
  20. c语言自学听不懂,为什么C语言这么难学,怎么才能学好呢?

热门文章

  1. python画图代码turtle-介绍下Python里自带的一个有趣画图模块库:Turtle库
  2. r语言和python-R语言和Python一块学习会弄混吗
  3. python 制作gif-利用Python如何制作好玩的GIF动图详解
  4. php和python和java-Java、PHP和Python各有什么优势 分别能做什么
  5. java和python工资-Python和Java,哪个就业薪资更高
  6. python2好还是python3好-总结对比Python2和Python3之间的区别
  7. python基本使用-Python time库基本使用方法分析
  8. python和java一样吗-python 和 java 的区别
  9. python好学吗mooc中文网-Python语言程序设计
  10. python循环语句-python循环语句(第十节)