首頁 >後端開發 >php教程 >淺談PHP原始碼三:關於strrchr, strstr, stristr函數

淺談PHP原始碼三:關於strrchr, strstr, stristr函數

不言
不言原創
2018-06-28 16:34:052798瀏覽

這篇文章主要介紹了關於淺談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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn