• 技术文章 >后端开发 >php教程

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

    不言不言2018-06-28 16:34:05原创769
    这篇文章主要介绍了关于浅谈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函数的详细内容,更多请关注php中文网其它相关文章!

    声明:本文原创发布php中文网,转载请注明出处,感谢您的尊重!如有疑问,请联系admin@php.cn处理
    上一篇:浅谈PHP源码二:关于strlen, strtolower, strtoupper, ord, chr函数 下一篇:浅谈PHP源码四:关于count函数
    大前端线上培训班

    相关文章推荐

    • PHP表单学习之$_GET与$_POST变量的使用与区别• PHP表单学习之表单的输入与验证• PHP数据库学习之怎样使用PDO执行SQL语句?• PHP数据库学习之怎样使用PDO连接数据库?• PHP数据库学习之怎样使用PDO获取查询结果?

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网