php踩過的那些坑(2) strpos引發的血案


一、前方有坑

php某些自帶函數,如果使用不當,也會坑得你人仰馬翻。比如:strpos()

先了解一下strpos()函數是干啥的。

strpos — 查找字符串首次出現的位置

用法: int strpos ( string $haystack , mixed $needle [, int $offset = 0 ] )

看下面代碼:

$a = 'abcd';

$b = 'b';

$c = 'a';

echo strpos($a,$b) ? '原來是兄弟<br/>' : '非我族類,砍ta<br/>';

echo strpos($a,$c) ? '原來是兄弟<br/>' : '非我族類,砍ta<br/>';

echo strpos($a,$c)!=false ? '原來是兄弟' : '非我族類,砍ta';

結果顯示

原來是兄弟

非我族類,砍ta

非我族類,砍ta

$c 命名是$a的一部分,結果當成異類,連着被砍了兩次,冤枉,引發了一場本是同根生,相煎何太急的血案悲劇!

php踩過的那些坑(4) strpos引發的血案

二、防坑攻略

stripos()返回的是字符串在另一個字符串出現的位置,而這個位置是從0開始計算的。$c在$a中出現的位置是0,因此被砍。

所以,正確的判斷應該是:

$a = 'abcd';

$c = 'a';

echo strpos($a,$c)!==false ? '原來是兄弟' : '非我族類,砍ta';

三、為啥有坑

防坑攻略里說了一些原因,這里先充分了解strpos()函數說起。

用法:int strpos ( string $haystack , mixed $needle [, int $offset = 0 ] )

參數:

  • haystack 在該字符串中進行查找。

  • needle 如果 needle 不是一個字符串,那么它將被轉換為整型並被視為字符的順序值。

  • offset 可選的 offset 參數可以用來指定從 haystack 中的哪一個字符開始查找。返回的數字位置是相對於 haystack 的起始位置而言的。

返回值

以整型返回位置信息。如果沒找到 needle,strpos() 將返回布爾型的 FALSE 值。

也就是說,此函數可能返回布爾值 FALSE,但也可能返回等同於 FALSE 的非布爾值,例如 0 或 ""(空串)。因此,在判斷的時候,需要使用恆等於’===‘或者恆不等於’===‘來判斷,千萬不能省去一個’=‘號。

四、防坑擴展:

1、類似的函數還有

strrpos() - 計算指定字符串在目標字符串中最后一次出現的位置

stripos() - 查找字符串首次出現的位置(不區分大小寫)

strripos() - 計算指定字符串在目標字符串中最后一次出現的位置(不區分大小寫)

2、判斷一個字符串是否在另一個字符串中還有一個函數:strstr()。與strpos()有一點不同是,該函數的返回值是false或者字符串的一部分。如果單純的判斷兩個字符串的包含關系,最好使用strpos,因為速度更快、耗費內存更少。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM