一、前方有坑
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的一部分,結果當成異類,連着被砍了兩次,冤枉,引發了一場本是同根生,相煎何太急的血案悲劇!
二、防坑攻略
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,因為速度更快、耗費內存更少。