現在の位置: ホーム> 最新記事一覧> PHP STRPOS関数を使用するときに否定的な引数を渡すとどうなりますか?その動作の詳細な分析

PHP STRPOS関数を使用するときに否定的な引数を渡すとどうなりますか?その動作の詳細な分析

gitbox 2025-07-17

PHPでは、 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">mixed</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はオプションのオフセットパラメーターであり、検索を開始する場所を示しています。

通常、 Strposは、サブストリングが最初に表示される場所のインデックスを返します(0からカウント)。サブストリングが見つからない場合、 falseが返されます。

PHP STRPOSの通常の動作

まず第一に、 strpos関数の通常の動作を理解することが重要です。オフセット( $ offset )が渡されないと、関数は文字列の先頭を調べ始めます。次の例を考えてみましょう。

 <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">"world"</span></span><span>;

</span><span><span class="hljs-variable">$position</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-variable">$position</span></span><span>; </span><span><span class="hljs-comment">// 出力 7</span></span><span>
</span></span>

この例では、 Strposは「Hello、World!」に「World」が最初に登場する7つを返します。

$ offsetパラメーターの関数

Strpos関数$ offsetの3番目のパラメーターはオプションです。ターゲット文字列の検索を開始する場所を指定できます。例えば:

 <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">"o"</span></span><span>;

</span><span><span class="hljs-variable">$position</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-number">5</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$position</span></span><span>; </span><span><span class="hljs-comment">// 出力 8</span></span><span>
</span></span>

この例では、 Strposはインデックス5から検索を開始するため、「世界」、つまり8の2番目の「O」の位置を返します。

負の数を$ offsetパラメーターに渡すときの動作

$ offsetパラメーターとして負の数値を渡すと、 strpos関数はターゲット文字列の端から楽しみます。具体的には、負の数のオフセットは、文字列の端からのオフセットを示し、負の数の絶対値は端からカウントされる文字の数です。

例えば:

 <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">"o"</span></span><span>;

</span><span><span class="hljs-variable">$position</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-number">6</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$position</span></span><span>; </span><span><span class="hljs-comment">// 出力 8</span></span><span>
</span></span>

この例では、 -6は文字列の端から6文字(「!」文字の後)、つまり「World!」の位置から始まります。 Strposは「O」の場所を見つけて8を返しました。

負の数$ offsetの解析プロセス

ネガティブなオフセットの作業原則を理解するために、別の例を見てみましょう。

 <span><span><span class="hljs-variable">$haystack</span></span><span> = </span><span><span class="hljs-string">"abcdef"</span></span><span>;
</span><span><span class="hljs-variable">$needle</span></span><span> = </span><span><span class="hljs-string">"c"</span></span><span>;

</span><span><span class="hljs-variable">$position</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-number">2</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$position</span></span><span>; </span><span><span class="hljs-comment">// 出力 2</span></span><span>
</span></span>

この例では、オフセット-2は、文字列「abcdef」の最後から2番目の文字「e」を楽しみにしています。 STRPOS関数は「E」で始まり、サブストリング「C」を探します。 「C」は、最後から2番目のキャラクターからカウントされるときに2番目の位置として2を返すためです。

注意すべきこと

負のオフセットを使用することは非常に柔軟ですが、まだ注意を払う必要があるいくつかの重要なポイントがあります。

  1. オフセットを過度に負にすることはできません。負の数の絶対値がターゲット文字列の長さよりも大きい場合、 Strposは文字列の開始位置から検索されます。たとえば、 -20をオフセットとして渡し、ターゲット文字列に10文字しかない場合、 STRPOSは開始位置から見上げるのと同等になります。

  2. 結果は予想通りではない場合があります。負のオフセットにより、ルックアップが比較的複雑になります。実際の開発では、文字列の長さまたは検索の開始点が決定されない場合、結果が誤っている可能性があります。したがって、開発者は、オフセットとターゲット文字列の長さの関係を必ず理解する必要があります。

要約します

PHPのSTRPOS関数は、負のオフセットを渡すときに文字列の端から楽しみにしています。これにより、柔軟性が向上します。ただし、同時に、オフセットの絶対値が文字列の長さを超えないことを確認するために、負のオフセットを使用する場合は注意してください。これを理解することで、開発者は検索操作をより正確に制御し、不必要なエラーを回避できます。