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 にリストされている文字列のいずれかが含まれているかどうかを確認しようとします。 $unacceptables で。しかし、予期せず「Acceptable!」と表示されます。 $link に "https:" が存在する場合でも、すべての場合に当てはまります。
解決策:
問題の根本は、結果を比較するための PHP の動作にあります。 strpos() の。デフォルトでは、strpos() は文字列内で部分文字列が最初に出現する位置を表す整数を返します。部分文字列が見つからない場合は、false を返します。
コード スニペットでは、strpos() を true と比較するとき、基本的に、結果がゼロ以外の数値であるかどうかをチェックしています。この関数は一致するものが見つかると常に数値を返すため、この比較は常に true を返し、部分文字列の存在を誤って示します。
これを解決するには、代わりに厳密な不等号演算子 (!==) を使用します。不等価性をチェックします。これにより、部分文字列が見つからない場合に false との比較が確実に行われるようになります。
// ... if (strpos($link, $unacceptable) !== false) {
この簡単な変更に従うことで、コード スニペットは、$link URL に「受け入れられないものが見つかりました」という文字列が含まれている場合に、「受け入れられない文字列が見つかりました」を正しく識別して出力します。禁止された部分文字列の一部。
以上がPHP の `strpos()` による厳密な等価性が予期しない結果を生むことが多いのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。