2010-03-07 69 views
19
if(strpos("http://www.example.com","http://www.")==0){ // do work} 

我希望這可以解決它的真實性。但是,當我做php 5 strpos()返回0和false之間的區別?

if(strpos("abcdefghijklmnop","http://www.")==0){// do work} 

這也傳遞PHP 5,因爲據我可以計算出對strpos返回false意爲0

這是正確的思想/行爲會發生什麼?如果是的話,那麼測試這個子字符串是在另一個字符串的開頭是什麼?

回答

39

是的,這是正確的/預期的行爲:

  • strpos可以返回0當有比賽在的開始字符串
  • 並且當沒有匹配時它將返回false

事情是你不應該使用==來比較0false;你應該使用===,像這樣:

if(strpos("abcdefghijklmnop","http://www.") === 0) { 

} 

或者:

if(strpos("abcdefghijklmnop","http://www.") === false) { 

} 


欲瞭解更多信息,請參見Comparison Operators

  • $a == $bTRUE如果$a等於$b
  • $a === $bTRUE如果$a等於$b,和它們是相同類型的

而且,引述the manual page of strpos

這個函數可以返回布爾 FALSE,但也可以返回 非布爾值,其結果爲 FALSE,如0""
請 在Booleans上閱讀 的更多信息。
使用the === operator來測試此函數的返回值 的值。

9

===!==比較類型值:

if (strpos("abcdefghijklmnop", "http://www.") !== false){// do work} 
4

strpos返回int或布爾值false。 ==運算符也會將0計算爲false,您希望使用===運算符(三個等號),該運算符還會檢查被比較的類型是否相同,而不是僅僅查看它們是否可以被評估爲相同。

所以

if (strpos($hastack, $needle) === 0) 
{ 
    // the $needle is found at position 0 in the $haystack 
} 
1

0strpos一個可能的返回值,當它找到一個匹配在開始的時候。如果未找到匹配項,則返回false(布爾值)。因此,您需要使用===運算符檢查strpos的返回值,該運算符將檢查值和類型,而不是使用僅檢查值的==

0

我個人傾向於用這種方式:

if(!strpos($v,'ttp:'))$v='http://'.$v; 

if(strpos(' '.$v,'http')) 

避免 「0」 位置,然後總是使它成爲一個人數超過0 歡呼

+1

如果您代碼使用非標準的非標準方式來解決標準問題,所有的可維護性已經離開了建築物。每個體面的PHP開發人員都知道並期待'==='符號 - 你的回答只是提供了一個過時的性能和可讀性殺手。 – 2015-05-26 10:55:43

相關問題