ホームページ > バックエンド開発 > PHPチュートリアル > PHP の `strpos()` による厳密な等価性が予期しない結果を生むことが多いのはなぜですか?

PHP の `strpos()` による厳密な等価性が予期しない結果を生むことが多いのはなぜですか?

Susan Sarandon
リリース: 2024-12-16 15:18:20
オリジナル
196 人が閲覧しました

Why Does Strict Equality with `strpos()` in PHP Often Produce Unexpected Results?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート