PHP 中不可靠的布林比較:了解strpos() 的怪癖
在PHP 中,strpos() 函數是一個基本工具在字串內搜尋。然而,程式設計師遇到的一個常見陷阱是將使用嚴格相等運算子 (===) 的 strpos() 的結果與 true 進行比較。
問題:
考慮以下程式碼片段:
$link = 'https://google.com'; $unacceptables = ['https:','.doc','.pdf', '.jpg', '.jpeg', '.gif', '.bmp', '.png']; foreach ($unacceptables as $unacceptable) { if (strpos($link, $unacceptable) === true) { echo 'Unacceptable Found<br />'; } else { echo 'Acceptable!<br />'; } }
此程式碼嘗試檢查$link URL 是否包含中列出的任何字串$不可接受的。然而,它意外地列印出「可接受!」對於所有情況,即使 $link 中存在「https:」。
解決方案:
問題的根源在於 PHP 比較結果的行為strpos() 的。預設情況下,strpos() 傳回一個整數,表示子字串在字串中第一次出現的位置。如果未找到子字串,則傳回 false。
在程式碼片段中,將 strpos() 與 true 進行比較時,實際上是在檢查結果是否為非零數字。由於函數在找到匹配項時始終傳回一個數字,因此此比較始終傳回 true,從而錯誤地指示子字串的存在。
要解決此問題,請改用嚴格不等運算子 (!==),該運算子檢查不相等性。這可確保在未找到子字串時進行與 false 的比較。
// ... if (strpos($link, $unacceptable) !== false) {
透過執行此簡單修改,當 $link URL 包含一個時,程式碼片段將正確識別並列印「Unacceptable Found」禁止的子字串。
以上是為什麼 PHP 中的「strpos()」嚴格相等常常會產生意想不到的結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!