课程咨询 :13623629309

太原PHP培训 > 达内新闻 > 太原达内php培训班:PHP源码阅读:strpos、strstr、stripos、stristr函数
  • 太原达内php培训班:PHP源码阅读:strpos、strstr、stripos、stristr函数

    发布:太原PHP培训      来源:伯乐在线      时间:2016-06-01

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

    strpos

    如果offset指定了,查找会从offset的位置开始。offset不能为负数。

    返回needle第一次出现在haystack的位置。如果在haystack中找不到needle,则返回FALSE。

    needle,如果needle不是字符串,它会被转换成整型数值并赋值为该数值的ASCII字符。请看下面例子。

    例子

    strpos核心源码

    有一点要注意的是,如果needle不是字符串的话,会调用php_needle_char函数将needle转成整型数字并转换为其ASCII值。

    查找函数

    函数最后返回的是found,php_memnstr函数实现了查找的方法。那么再继续看看php_memnstr函数做了什么:

    php_memnstr是函数zend_memnstr的宏定义,查看zend_memnstr函数如下:

    第一个优化,因为(char *)memchr(p, *needle, (end-p+1)是在end – needle_len + 1(即haystack_len+1)中查找,如果p为空,说明needle的第一个字符在p中从未出现过。

    strstr

    这个函数的区分大小写的。

    如果needle在haystack中不存在,返回FALSE。

    如果before_needle为true,则返回haystack中needle在haystack第一次出现的位置之前的字符串。

    strstr核心源码

    strstr函数的前半部分跟strpos类似,区别在于strstr函数在找到位置后,需要返回haystack部分的字符串。part变量就是调用strstr函数时传递的before_needle变量。

    stripos

    stristr

    核心源码

    可以知道,found是从php_stristr中得到的,继续查看php_stristr函数:

    这个函数的功能就是将字符串都转成小写之后调用php_mennstr函数来查找needle在haystack第一次出现的位置。

    总结

    因为strpos/stripos返回的是位置,位置从0开始计算,所以判断查找失败都用=== FALSE更适合。

    阅读PHP的源码收获挺多,一方面可以知道某个函数的具体实现原理是怎样的,另一方面可以学习到一些编程优化方案。

    到此本文结束,如果还有什么疑问或者建议,可以多多交流,原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。

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

上一篇:太原达内php培训班:一个屌丝程序猿的人生(20)

下一篇:太原达内PHP培训班:C#基础温习: 理解委托和事件

最新开班日期  |  更多

php高级开发名企定制班(剩2个名额)

php高级开发名企定制班(剩2个名额)

开班日期:12-29

php高级开发周末班(剩5个名额)

php高级开发周末班(剩5个名额)

开班日期:12-29

php高级开发免费试听(剩5个名额)

php高级开发免费试听(剩5个名额)

开班日期:12-29

更多高级开发工程师精品班

更多高级开发工程师精品班

开班日期:12-29

  • 地址:山西省太原市小店区学府街长治路高新国际A座24层
  • 课程培训电话:13623629309     全国服务监督电话:400-827-0010
  • 服务邮箱 ts@tedu.cn
  • 2001-2016 达内国际公司(TARENA INTERNATIONAL,INC.) 版权所有 京ICP证08000853号-56