PHPでは、 StrcSpn()とStrStr()は、2つの非常に実用的な文字列処理関数です。 strcspn()は、最初から遭遇する指定された文字セットと一致しない文字列内の最初の文字の位置を計算するために使用されますが、 strcspn()は別の文字列の文字列の最初の発生を見つけるために使用されます。これらの2つの機能は、場合によっては一緒に使用する必要がありますが、組み合わせて使用するといくつかの一般的な問題が発生する場合があります。この記事では、これらの問題を分析し、ソリューションを提供します。
strcspn() :
strcspn(string $ haystack、string $ charlist):int
この関数は、最初から遭遇した$ Charlistの文字と一致しない$ HayStackの最初の文字位置を計算して返します。一致する文字が見つからない場合、文字列全体の長さが返されます。
strstr() :
Strstr(string $ haystack、string $ edele、bool $ before_needle = false):string | false
この関数は、$ haystack文字列の位置を返します。ここでは、$針のサブストリングが初めて表示されます。 trueに設定すると、 $針が表示される前にパラメーター$ before_needleがパーツを返します。
多くの開発者は、これらの2つの機能を一緒に使用する際に、混乱する注文の問題を経験する場合があります。 strcspn()は位置を返すため、 strstr()は通常、文字列上のある位置からサブストリングを見つけるために使用されます。誤って逆に呼び出された場合、必要な文字列位置が適切に配置されていない場合があります。
例:
<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">$charlist</span></span><span> = </span><span><span class="hljs-string">",!"</span></span><span>;
</span><span><span class="hljs-variable">$position</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strcspn</span></span><span>(</span><span><span class="hljs-variable">$haystack</span></span><span>, </span><span><span class="hljs-variable">$charlist</span></span><span>); </span><span><span class="hljs-comment">// 最初の非コマまたは感嘆符の場所を見つける</span></span><span>
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strstr</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-comment">// 探す "World" そこにありますか $haystack 真ん中</span></span><span>
</span></span>
この方法では、strcspn()によって得られた位置に基づいたサブストリングを探すことはできません。 StrStr()は、文字列の先頭から常に検索されます。
StrSTR()を使用する前に、 StrcSpn()を介して正しい開始位置を計算し、 substr()を使用して$ HayStackのサブストリングを傍受して、正しい検索範囲を確保することができます。
<span><span><span class="hljs-variable">$position</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strcspn</span></span><span>(</span><span><span class="hljs-variable">$haystack</span></span><span>, </span><span><span class="hljs-variable">$charlist</span></span><span>);
</span><span><span class="hljs-variable">$substring</span></span><span> = </span><span><span class="hljs-title function_ invoke__">substr</span></span><span>(</span><span><span class="hljs-variable">$haystack</span></span><span>, </span><span><span class="hljs-variable">$position</span></span><span>); </span><span><span class="hljs-comment">// この場所から始まるサブストリングを取得します</span></span><span>
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strstr</span></span><span>(</span><span><span class="hljs-variable">$substring</span></span><span>, </span><span><span class="hljs-variable">$needle</span></span><span>); </span><span><span class="hljs-comment">// 在子字符串真ん中探す "World"</span></span><span>
</span></span>
strcspn()指定された文字セットが見つからないときに文字列の長さを返しますが、 strcspn()はターゲットサブストリングが見つからない場合に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">"PHP"</span></span><span>;
</span><span><span class="hljs-variable">$charlist</span></span><span> = </span><span><span class="hljs-string">",!"</span></span><span>;
</span><span><span class="hljs-variable">$position</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strcspn</span></span><span>(</span><span><span class="hljs-variable">$haystack</span></span><span>, </span><span><span class="hljs-variable">$charlist</span></span><span>);
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strstr</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-comment">// 見つかりません "PHP",戻る false</span></span><span>
</span></span>
上記のコードでは、 「PHP」が$ HayStackにないため、 StrSTR()がFALSEを返します。ただし、開発者は虚偽を処理しない可能性があり、その後の操作の障害が発生します。
StrSTR()を使用する前に、サブストリングが正常に見つかるかどうかを確認します。
<span><span><span class="hljs-variable">$position</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strcspn</span></span><span>(</span><span><span class="hljs-variable">$haystack</span></span><span>, </span><span><span class="hljs-variable">$charlist</span></span><span>);
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strstr</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">if</span></span><span> (</span><span><span class="hljs-variable">$result</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">"サブストリングが見つかりません!"</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">"サブストリングが見つかりました:"</span></span><span> . </span><span><span class="hljs-variable">$result</span></span><span>;
}
</span></span>
strcspn()とstrStr()はどちらも文字列操作関数であり、大量のデータで頻繁に呼び出されるとパフォーマンスに影響を与える可能性があります。特にループでは、特に複数回検索するために複数のサブストリングまたはキャラクターセットが必要な場合、 StrcSpn()とStrStr()の繰り返し計算は不必要な繰り返しにつながる可能性があります。
解決:
ループの前にターゲット文字列を事前に処理し、各反復で繰り返し呼び出しを回避します。
<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">$charlist</span></span><span> = </span><span><span class="hljs-string">",!"</span></span><span>;
</span><span><span class="hljs-variable">$position</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strcspn</span></span><span>(</span><span><span class="hljs-variable">$haystack</span></span><span>, </span><span><span class="hljs-variable">$charlist</span></span><span>);
</span><span><span class="hljs-variable">$substring</span></span><span> = </span><span><span class="hljs-title function_ invoke__">substr</span></span><span>(</span><span><span class="hljs-variable">$haystack</span></span><span>, </span><span><span class="hljs-variable">$position</span></span><span>);
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strstr</span></span><span>(</span><span><span class="hljs-variable">$substring</span></span><span>, </span><span><span class="hljs-variable">$needle</span></span><span>);
</span><span><span class="hljs-comment">// さらなる操作</span></span><span>
</span></span>
不必要に繰り返される検索は、最初に位置を計算し、処理するサブストリングを抽出することで回避できます。
PHPでstrcspn()とstrstr()を使用する場合、遭遇する一般的な問題は、主に関数呼び出しの順序、返品値の処理、パフォーマンスの最適化に焦点を当てています。これら2つの機能の返品値を理解し、エラーチェックを実行することで、合理的に共通の落とし穴を効果的に回避できます。さらに、大量のデータを効率的に処理し、合理的な前処理、繰り返し計算を回避することも重要です。
この記事の導入を通じて、誰もが実際の開発でこれら2つの機能をよりよく利用して、コードの安定性と効率を改善できることを願っています。