PHPでは、 strpos関数を使用して、文字列が最初に別の文字列に表示される場所を見つけます。ターゲット文字列に指定されたサブストリングが見つからない場合、 strposはfalseを返します。ただし、 FalseはPHPの「False Value」と見なされるため、特に戻り値が0 (文字列の開始位置)と混同される場合、返品値を扱う場合、一部のプログラマー間で混乱を引き起こす可能性があります。この記事では、 STRPOSが虚偽を返す理由を徹底的に分析し、トラップを使用し、これらの状況を効果的に処理する方法を分析します。
STRPOS関数のプロトタイプは次のとおりです。
<span><span><span class="hljs-title function_ invoke__">strpos</span></span><span>(</span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$haystack</span></span><span>, </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$needle</span></span><span>, </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$offset</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>): </span><span><span class="hljs-keyword">int</span></span><span>|</span><span><span class="hljs-literal">false</span></span><span>
</span></span>
$ haystack :検索する文字列。
$針:見つかるサブストリング。
$ offset :オプションの開始オフセット、検索を開始する場所を指定します。
$針が$ haystackに存在する場合、 strposは$針が最初に表示される場所を返します(インデックスは0から始まります)。 $針が見つからない場合、 falseが返されます。
PHPでは、 Falseは「False値」として扱われるため、ブールの文脈では、 FalseはFalseとして扱われ、他の非ゼロ値は真であると扱われます。問題は、 strposがfalseまたは0を返す可能性があることです。 0はPHPの誤った値であるため、これは比較するときにプログラマー間で混乱を引き起こします。
たとえば、次のコードはエラーを生成する場合があります。
<span><span><span class="hljs-variable">$haystack</span></span><span> = </span><span><span class="hljs-string">"Hello, world!"</span></span><span>;
</span><span><span class="hljs-variable">$needle</span></span><span> = </span><span><span class="hljs-string">"Hello"</span></span><span>;
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">strpos</span></span><span>(</span><span><span class="hljs-variable">$haystack</span></span><span>, </span><span><span class="hljs-variable">$needle</span></span><span>)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Found!"</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Not found!"</span></span><span>;
}
</span></span>
$ haystackでの$ edeleの開始位置が0 (つまり、文字列の先頭にあります)の場合、 Strposは0を返し、判断が誤りとして扱われる場合、誤ってサブストリングが見つからなかったと信じているため、 「見つかりません!」 。
この問題を回避するには、 ===比較が値だけでなくタイプでもあるため、厳密な比較演算子( === )を使用する必要があります。この場合、サブストリングは、戻り値が厳密にfalseに等しい場合にのみ見つかりません。
<span><span><span class="hljs-variable">$haystack</span></span><span> = </span><span><span class="hljs-string">"Hello, world!"</span></span><span>;
</span><span><span class="hljs-variable">$needle</span></span><span> = </span><span><span class="hljs-string">"Hello"</span></span><span>;
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">strpos</span></span><span>(</span><span><span class="hljs-variable">$haystack</span></span><span>, </span><span><span class="hljs-variable">$needle</span></span><span>) !== </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Found!"</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Not found!"</span></span><span>;
}
</span></span>
このアプローチは、 0がfalseと間違えられている状況を回避します。コードは、$針が表示される場所が文字列の始まり(つまり、インデックスは0 )または中央のものであるかどうかに関係なく、それを正しく処理できます。
strposが虚偽を返すような状況がいくつかあります。
サブストリングは存在しません。最も一般的なケースは、ターゲットストリング$ hayStackにサブストリング$針がまったく表示されないことです。
無効なタイプ入力: STRPOSは、着信パラメータータイプが正しくない場合にfalseを返す場合があります( $ haystackなどは文字列ではありません)。
オフセットが大きすぎる:オフセットが設定されている場合、残りの文字列で$針を見つけることができなくなると、 strposもfalseを返します。
誤解に巻き込まれないようにするために、ここにSTRPOSの使用のためのいくつかのベストプラクティスがあります。
常に厳密な比較( === )を使用してください。前述のように、 0とfalseを混乱させるため、ゆるい比較演算子( == )を使用しないでください。
パラメーターのタイプを確認します: $ haystackと$針が両方とも文字列タイプであることを確認してください。わからない場合は、 is_string()関数を使用して確認できます。
オフセットの理解:オフセットを使用する場合、オフセットの効果を明確にし、大きすぎる値の設定を避ける必要があります。これにより、サブストリング検索が失敗する可能性があります。
STRPOS関数の戻り値は0またはfalseである場合があり、2つはPHPで異なるブールセマンティクスを持っています。 0が偽として扱われることによって引き起こされるプログラムエラーを回避するために、厳密なタイプの比較( !== false )を常に使用して、サブストリングが見つかったかどうかを判断する必要があります。 STRPOSの仕組みとその返品値を適切に処理する方法を理解することは、潜在的なエラーを回避し、堅牢なコードを書き込むための鍵です。