浅谈PHP源码三:关于strrchr,strstr,stristr函数

浅谈PHP源码三:关于strrchr,strstr,stristr函数

内容导读

收集整理的这篇技术教程文章主要介绍了浅谈PHP源码三:关于strrchr,strstr,stristr函数,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2379字,纯文字阅读大概需要4分钟

内容图文

这篇文章主要介绍了关于浅谈PHP源码三:关于strrchr, strstr, stristr函数,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

string strrchr ( string haystack, string needle )

返回haystack中最后一个needle(字符)所在位置以后的字符串
如果needle为数字,将这个数字转化为这个值所对应的字符
如果needle多于一个字符串,则取第一个字符
如果haystack为一个数字,会将这个数字直接转化成字符串
程序中调用convert_to_string_ex(haystack);

在此函数的实现中,基本上是对一些特殊情况的处理(如上),
到最后就是定位最后一个needle出现的位置,返回根据位置返回此位置以后的字符串,如果此位置不存在,同返回false

string strstr ( string haystack, string needle )
此函数功能与strrchr类似,只不过它的needle允许为字符串,并且是查找needle第一个出现的位置,根据此位置返回之后的字符串,如果不存在则返回FALSE

在其代码中有一些特别的细节值得学习,如下所示代码。

 static inline char *zend_memnstr(char *haystack, char *needle, int needle_len, char *end){

char *p = haystack;

char ne = needle[needle_len-1];

 if(needle_len > end-haystack) {



return NULL;

}

end -= needle_len;
 //

优化细节一,仅查找end-needle_len长度的字符串

 while (p <= end) {



//

优化细节二,此处先判断字符串的开头和结尾的字符是否一样,如果一样则再判断整个字符串,提升性能



if ((p = (char *)memchr(p, *needle, (end-p+1))) && ne == p[needle_len-1]) {







if (!memcmp(needle, p, needle_len-1)) {







return p;





}



}



 if (p == NULL) {





return NULL;



}



 p++;

}

 return NULL;}

以上代码是strstr和stristr函数实现的核心代码,功能:查找needle在haystack中首次出现的位置

string stristr ( string haystack, string needle )
stristr函数的功能与strstr类似,所不同的是其不区分大小写。
在PHP源码实现中主要区别是添加了将所有字符串转化为小写的操作,程序实现是在查找之前添加了如下代码:

 php_strtolower(s, s_len);php_strtolower(t, t_len);return php_memnstr(s, t, t_len, s + s_len);

PS:在看源码的过程中,再次看了《再再认指针》的前面一段话,多了一些体会;

指针能够进行加减法,原因并不是因为它是指针,加减法则不是属于指针这种变量的,而是地址这种数据类型的本能,正是因为地址具有加减的能力,所以才使指针作为存放地址的变量能够进行加减运算。
这跟整数变量因为整数能够进行加减乘除因而它也能进行加减乘除一个道理。

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

浅谈PHP源码二:关于strlen, strtolower, strtoupper, ord, chr函数

浅谈PHP源码一:explode和implode函数

以上就是浅谈PHP源码三:关于strrchr, strstr, stristr函数的详细内容,更多请关注Gxl网其它相关文章!

内容总结

以上是为您收集整理的浅谈PHP源码三:关于strrchr,strstr,stristr函数全部内容,希望文章能够帮你解决浅谈PHP源码三:关于strrchr,strstr,stristr函数所遇到的程序开发问题。 如果觉得技术教程内容还不错,欢迎将网站推荐给程序员好友。

内容备注

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。


本文关键词:

联系我们

在线咨询:点击这里给我发消息

邮件:w420220301@qq.com