确定一個字元串是否在另一個字元串中,在PHP中有很多方法實作。
strpos,strstr,strpbrk
這幾個函數都可以實作。那麼這幾個函數有什麼不同呢?
strstr
strstr — 查找字元串的首次出現,别名strchar

傳回 haystack 字元串從 needle 第一次出現的位置開始到 haystack 結尾的字元串。
如果$before_needle=true則傳回第一次出現的位置前面的字元。如果字元不存在,則傳回false。
如果needle不是一個字元串,那麼它将被轉化為整型并且作為字元的序号來使用。
strpos
查找字元串首次出現的位置。
傳回 needle 在 haystack 中首次出現的數字位置。查詢從offset開始。offset不影響輸出的數值。隻用于跳過不查詢的字元串。
官方文檔的Note中:
如果你僅僅想确定 needle 是否存在于 haystack 中,請使用速度更快、耗費記憶體更少的 strpos() 函數。
以下是strpos 的源碼
對比兩個函數的内部實作,除了offset之外,其實際差别在于strstr最後傳回了字元串,strpos傳回的是一個數。由于字元串傳回的時候涉及到字元串複制的過程,是以會有速度和記憶體上的損耗。在性能上,strpos 會比strstr好一點點。
可以看一下網上的測試效果,測試效果位址
strpbrk
strpbrk — 在字元串中查找一組字元的任何一個字元。傳回一個以找到的字元開始的子字元串。如果沒有找到,則傳回 FALSE。
strpbrk() 函數在 haystack 字元串中查找 char_list 中的字元。
相對于上面兩個函數,strpbrk相對粗暴些,直接兩個循環,實作字元的查找。在性能上,應該是這三個函數墊底的了。
總結
以字元串ABCGCAC為例。
strpos 傳回的是完整比對查詢字元串的第一次出現位置。strpos('ABCGCAC','CA')傳回結果是4。
strpbrk 傳回的是字元清單中比對的任意一個字元第一次出現之後的字元串。 strpbrk('ABCGCAC','CA') 傳回的内容是ABCGCAC
strstr 傳回的是完整比對查詢字元串第一次後出現後的字元串,strstr('ABCGCAC','CA') 傳回結果CAC
道路千萬條,性能優化第一條,一點點的提升也是提升,隻需要選擇函數的時候合理選擇。