天天看點

PHP strpos,strstr,strpbrk這幾個函數有什麼差別

确定一個字元串是否在另一個字元串中,在PHP中有很多方法實作。

strpos,strstr,strpbrk

這幾個函數都可以實作。那麼這幾個函數有什麼不同呢?

strstr

strstr — 查找字元串的首次出現,别名strchar

PHP strpos,strstr,strpbrk這幾個函數有什麼差別

傳回 haystack 字元串從 needle 第一次出現的位置開始到 haystack 結尾的字元串。

如果$before_needle=true則傳回第一次出現的位置前面的字元。如果字元不存在,則傳回false。

如果needle不是一個字元串,那麼它将被轉化為整型并且作為字元的序号來使用。

PHP strpos,strstr,strpbrk這幾個函數有什麼差別

strpos

查找字元串首次出現的位置。

PHP strpos,strstr,strpbrk這幾個函數有什麼差別

傳回 needle 在 haystack 中首次出現的數字位置。查詢從offset開始。offset不影響輸出的數值。隻用于跳過不查詢的字元串。

官方文檔的Note中:

如果你僅僅想确定 needle 是否存在于 haystack 中,請使用速度更快、耗費記憶體更少的 strpos() 函數。

以下是strpos 的源碼

PHP strpos,strstr,strpbrk這幾個函數有什麼差別

對比兩個函數的内部實作,除了offset之外,其實際差别在于strstr最後傳回了字元串,strpos傳回的是一個數。由于字元串傳回的時候涉及到字元串複制的過程,是以會有速度和記憶體上的損耗。在性能上,strpos 會比strstr好一點點。

可以看一下網上的測試效果,測試效果位址

strpbrk

strpbrk — 在字元串中查找一組字元的任何一個字元。傳回一個以找到的字元開始的子字元串。如果沒有找到,則傳回 FALSE。

PHP strpos,strstr,strpbrk這幾個函數有什麼差別

strpbrk() 函數在 haystack 字元串中查找 char_list 中的字元。

PHP strpos,strstr,strpbrk這幾個函數有什麼差別

相對于上面兩個函數,strpbrk相對粗暴些,直接兩個循環,實作字元的查找。在性能上,應該是這三個函數墊底的了。

總結

以字元串ABCGCAC為例。

strpos 傳回的是完整比對查詢字元串的第一次出現位置。strpos('ABCGCAC','CA')傳回結果是4。

strpbrk 傳回的是字元清單中比對的任意一個字元第一次出現之後的字元串。 strpbrk('ABCGCAC','CA') 傳回的内容是ABCGCAC

strstr 傳回的是完整比對查詢字元串第一次後出現後的字元串,strstr('ABCGCAC','CA') 傳回結果CAC

道路千萬條,性能優化第一條,一點點的提升也是提升,隻需要選擇函數的時候合理選擇。