strpos

1、前方有坑

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

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

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

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

看下面代碼:ip

$a = 'abcd';內存

$b = 'b';字符串

$c = 'a';string

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

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

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

結果顯示

原來是兄弟

非我族類,砍ta

非我族類,砍ta

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

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

2、防坑攻略

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

因此,正確的判斷應該是:

$a = 'abcd';

$c = 'a';

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

3、爲啥有坑

防坑攻略裏說了一些緣由,這裏先充分了解strpos()函數提及。

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

參數:

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

  • needle 若是 needle 不是一個字符串,那麼它將被轉換爲整型並被視爲字符的順序值。

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

返回值

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

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

4、防坑擴展:

一、相似的函數還有

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

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

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

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

相關文章
相關標籤/搜索