ホームページ >バックエンド開発 >PHPチュートリアル >PHP で strpos() を使用した緩やかな比較が予期しない結果につながるのはなぜですか?

PHP で strpos() を使用した緩やかな比較が予期しない結果につながるのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-26 10:38:09945ブラウズ

Why Does Loose Comparison with strpos() in PHP Lead to Unexpected Results?

strpos() 戻り値の解釈が甘いと予期せぬ結果につながる

文字列内の特定の部分文字列を見つける探求には、これは、PHP の strpos() 関数を使用するときに意図しない結果を引き起こす可能性がある落とし穴です。 strpos() の戻り値の緩やかなチェックが混乱を引き起こす理由の背後にある謎を解明しましょう。

以下のコード スニペットを考えてみましょう:

if (
    strpos($grafik['data'], $ss1) != false
    && strpos($grafik['data'], $ss2) != false
    && strpos($grafik['data'], $ss1) < strpos($grafik['data'],$ss2)
)

このコードでは、strpos() を使用して、 $grafik['data'] 文字列内の部分文字列 $ss1 と $ss2 の位置。その目的は、両方の部分文字列の存在をチェックし、$ss1 が $ss2 よりも前に順序付けされていることを確認することです。

PHP マニュアルによると、部分文字列が見つからない場合、strpos() は false を返します。ただし、部分文字列がゼロ位置 (つまり、文字列の先頭) から始まる場合、strpos() は 0 を返すことがわかりました。これにより、式:

strpos($grafik['data'], $ss1) != false

が次のように評価されるという意図しない解釈が生じます。 $ss1 がゼロの位置から存在しているにもかかわらず、 false になります。原因は弱い等価演算子 != で、これは 0 を false と同等とみなします。

この問題を修正するには、代わりに厳密な等価演算子 === を使用する必要があります。

if (
    strpos($grafik['data'], $ss1) !== false
    && strpos($grafik['data'], $ss2) !== false
    && strpos($grafik['data'], $ss1) < strpos($grafik['data'],$ss2)
)

=== 演算子は厳密な比較を実行し、0 が false と同等とはみなされないようにします。この修正により、コードは $ss1 と $ss2 の存在とそれらの相対位置を正しく判断するようになります。

以上がPHP で strpos() を使用した緩やかな比較が予期しない結果につながるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。