意図しない真実: strpos() 比較の不一致を理解する
PHP 関数 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 />'; } }
驚くべきことに、このコードは「Acceptable!」と出力します。 $unacceptables 配列内のすべての要素に対して、$link 変数に "https:" が存在する場合でも同様です。
このパズルを解明するには、strpos() のセマンティクスを詳しく調べる必要があります。ドキュメントに記載されているように、strpos() は $link 内の $unacceptable 文字列の「最初に出現した数値位置」を返します。この場合、strpos() は位置 0 で「https:」を見つけ、PHP の真の値である 0 を返します。
したがって、if ステートメントの条件 (strpos($link, $unacceptable) === true) は、strpos() が常に数値位置を返し、常にブール値に強制されるため、毎回 true と評価されます。 true.
これを修正するには、非厳密比較演算子 (!==) を使用する必要があります:
if (strpos($link, $unacceptable) !== false) {
比較を「false に等しくない」に変更することで、次のことが保証されます。 if ステートメントは、strpos() が一致を見つけてゼロ以外の値 (つまり、0 以外の数値位置) を返した場合にのみ true と評価されます。
以上がPHP 文字列検索で strpos() と `=== true` の比較が失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。