PHPでは、 strristr()関数は、文字列内の指定されたサブストリングの最初の発生を見つけるために使用される関数です。この関数は症例感受信性であり、テキストのマッチングと検索によく使用されます。ただし、大量のテキストで頻繁に検索する必要がある場合、特に大きなテキストを扱う場合、 strristr()のパフォーマンスはボトルネックになる可能性があります。したがって、この関数の効率を改善することは、アプリケーションのパフォーマンスを改善するために重要です。
strristr()関数の基本的な使用法は次のとおりです。
<span><span><span class="hljs-title function_ invoke__">stristr</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">string</span></span><span>|</span><span><span class="hljs-literal">false</span></span><span>
</span></span>
$ haystack :検索するメイン文字列。
$針:見つかるサブストリング。
この関数は、 $針が最初に発生した後、 $ haystackの部分を返します。
Strristr()はシンプルで使いやすいですが、特に複数のルックアップ操作または非常に大きなテキストファイルが関与している場合、そのパフォーマンスは大規模なテキスト検索に適していません。
strristr()は、 $ haystack文字をキャラクターごとにスキャンする必要があります。大きな文字列で複数の検索操作を実行すると、文字列全体をゼロからスキャンするたびに可能になります。この方法は、特にファイルの内容または大量のデータを処理する場合、頻繁に検索する必要がある操作に対しては比較的非効率的です。
たとえば、多くのテキストを含むログファイルがあり、複数の異なるキーワードを探す必要があるとします。 strristr()がすべてのルックアップと呼ばれる場合、複数の不必要なトラバーサルが発生し、パフォーマンスに影響します。
サブストリングが存在するかどうかを知ることに気をつけて、サブストリング後にコンテンツを返す必要がない場合は、 Strpos()関数の使用を検討できます。 strpos()と比較して、 strpos()は最初の一致の位置のみを返し、サブストリングコンテンツ全体を返す必要はありません。
<span><span><span class="hljs-variable">$haystack</span></span><span> = </span><span><span class="hljs-string">"This is a large text example that we are working with."</span></span><span>;
</span><span><span class="hljs-variable">$needle</span></span><span> = </span><span><span class="hljs-string">"large"</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">if</span></span><span> (</span><span><span class="hljs-variable">$position</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 at position: "</span></span><span> . </span><span><span class="hljs-variable">$position</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>
strpos()の時間の複雑さはo(n)であり、nは$ haystackの長さであり、 strpos()の追加の文字列戻り操作を回避します。
複数のルックアップ操作が必要であり、回避するために複数の文字列スキャンが必要な場合は、正規表現の使用を検討できます。正規表現は、関数を見つけるための複数の呼び出しなしで一度に複数のパターンに一致することができます。 PHPは、preg_match()やpreg_match_all()などの関数を提供して、この関数を実装します。
<span><span><span class="hljs-variable">$haystack</span></span><span> = </span><span><span class="hljs-string">"This is a large text example that we are working with."</span></span><span>;
</span><span><span class="hljs-variable">$pattern</span></span><span> = </span><span><span class="hljs-string">"/large|text|example/i"</span></span><span>; </span><span><span class="hljs-comment">// 複数のキーワードの定期的なマッチングを使用します</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">preg_match</span></span><span>(</span><span><span class="hljs-variable">$pattern</span></span><span>, </span><span><span class="hljs-variable">$haystack</span></span><span>)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Match 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">"No match found."</span></span><span>;
}
</span></span>
正規表現を使用すると、スキャンで複数のサブストリングを一致させることができ、 strristr()への繰り返しの呼び出しを回避できます。
検索プロセス中に特定のテキストコンテンツのみを交換または削除する必要がある場合、 STR_REPLACE()を介してテキストを事前に処理する方が効率的です。 str_replace()は単一のトラバーサルで複数の交換操作を実行できるため、通常、1つずつ検索するよりも速いです。
<span><span><span class="hljs-variable">$haystack</span></span><span> = </span><span><span class="hljs-string">"This is a large text example that we are working with."</span></span><span>;
</span><span><span class="hljs-variable">$search</span></span><span> = [</span><span><span class="hljs-string">"large"</span></span><span>, </span><span><span class="hljs-string">"text"</span></span><span>, </span><span><span class="hljs-string">"example"</span></span><span>];
</span><span><span class="hljs-variable">$replace</span></span><span> = [</span><span><span class="hljs-string">"big"</span></span><span>, </span><span><span class="hljs-string">"word"</span></span><span>, </span><span><span class="hljs-string">"sample"</span></span><span>];
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">str_replace</span></span><span>(</span><span><span class="hljs-variable">$search</span></span><span>, </span><span><span class="hljs-variable">$replace</span></span><span>, </span><span><span class="hljs-variable">$haystack</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$result</span></span><span>;
</span></span>
このアプローチは、テキストを前処理する必要がある状況に特に適しています。
大きなテキストファイルで複数の検索が行われたら、不要なメモリの割り当てがなく、各ルックアップのコピーを確認してください。特に非常に大きなテキストデータを扱う場合、パフォーマンスはメモリポインターとストリーミング読み取りを使用して最適化できます。
<span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">'large_file.txt'</span></span><span>, </span><span><span class="hljs-string">'r'</span></span><span>);
</span><span><span class="hljs-keyword">while</span></span><span> ((</span><span><span class="hljs-variable">$line</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fgets</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>)) !== </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">stristr</span></span><span>(</span><span><span class="hljs-variable">$line</span></span><span>, </span><span><span class="hljs-string">'needle'</span></span><span>)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Found in line: "</span></span><span> . </span><span><span class="hljs-variable">$line</span></span><span>;
}
}
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>);
</span></span>
上記のコードでは、ラインごとにファイルを読み取り、検索します。これにより、メモリ使用量が減少し、ファイル全体がメモリに一度にロードされません。
頻繁に検索シナリオの場合、キャッシュ戦略を採用すると、パフォーマンスが大幅に向上する可能性があります。たとえば、検索された結果をキャッシュして、同じサブストリングを繰り返し検索しないようにします。 PHPのAPCU拡張機能またはキャッシュストレージにRedisなどの外部キャッシュツールを使用できます。
<span><span><span class="hljs-variable">$haystack</span></span><span> = </span><span><span class="hljs-string">"This is a large text example that we are working with."</span></span><span>;
</span><span><span class="hljs-variable">$needle</span></span><span> = </span><span><span class="hljs-string">"large"</span></span><span>;
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$cachedResult</span></span><span> = </span><span><span class="hljs-title function_ invoke__">apcu_fetch</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 from cache: "</span></span><span> . </span><span><span class="hljs-variable">$cachedResult</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stristr</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-title function_ invoke__">apcu_store</span></span><span>(</span><span><span class="hljs-variable">$needle</span></span><span>, </span><span><span class="hljs-variable">$result</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-variable">$result</span></span><span>;
}
</span></span>
これにより、特に複雑なテキストを処理する場合、繰り返し検索のオーバーヘッドが減少し、キャッシュはアプリケーションの応答速度を大幅に改善できます。
Strristr()はPHPで非常に実用的な機能ですが、パフォーマンスの最適化に関しては、そのキャラクターごとのスキャンは、大きなテキストや頻繁な検索を扱う際にボトルネックにつながる可能性があります。 Strpos() 、正規表現、メモリ最適化処理、キャッシュ戦略などの代替方法を採用することにより、検索効率を効果的に改善し、システムの負担を軽減し、大規模なテキスト処理のパフォーマンスを最適化できます。