2014-01-28 90 views
-1

我想在PHP函數中格式化名稱。名稱格式爲Forname SURNAME,我需要格式Forename SurnamePHP strpos()返回錯誤的結果

我寫的函數很好地完成了這項工作,但遇到如O'HARE這樣的姓時,當所需的格式爲O'Hare時,返回的名稱是O'hare

爲了實現這個條件,我用下面的代碼:

... 
if(stripos($name, "O'") != false) 
{ 
    $nameArr = array(); 
    $expl3 = explode(' ', trim($name)); 
    print_r($expl3); //this prints [0] => Forename [1] => O'SURNAME as expected 
    foreach($expl3 as $ex) 
    { 
     if(stripos($ex, "O'") != false) 
     { 
      echo '<h1>string position found</h1>'; //this condition is not being met 
      $newName = str_replace("O'", '', ($ex)); 
      $nameArr[] = "O'" . ucfirst(strtolower($newName)); 
     } 
     else 
     { 
      $nameArr[] = ucfirst(strtolower($ex)); 
     } 
    } 
    $formattedName = implode(' ', $nameArr); 
} 
else 
{ 
    $formattedName = trim(ucwords(strtolower($name))); 
} 
return $formattedName; 

功能尚在格式Forename O'SURNAME返回名稱。

我的問題是,爲什麼是第二stripos()沒有找到O'它事實上是存在的,當我print_r()當很明顯?

回答

3

您需要使用與!==嚴格的比較:

stripos($ex, "O'") !== false 

stripos()將返回0因爲O'指數在字符串的開頭。如果根本找不到子字符串,則返回false,這就是爲什麼您需要執行嚴格(類型檢查)比較的原因。

更可以發現in the documentation

0

!=更改爲!==並且您的代碼將完美工作。

所以stripos($name, "O'") != false應該變成stripos($name, "O'") !== falsestripos($ex, "O'") != false應該變成stripos($ex, "O'") !== false

從PHP手冊:

這個函數可以返回布爾值FALSE,但也可能返回的值爲FALSE的非布爾值。請閱讀Booleans的部分了解更多信息。使用=== operator來測試此函數的返回值。

stripos($x, $y)回報0$y發生在$x開始,當$y$x發生在所有返回false。鬆散比較(==!=)無法區分這兩種截然不同的情況。因此,您需要嚴格比較(===!==),它不僅會檢查值,還會檢查左側和右側的類型。

運行下面的代碼,該問題會清楚你:

var_dump(0 != false); 
var_dump(0 !== false); 
0

嘗試使用這樣的:

if(stripos($ex, "O'") !== false) 

商祺!