正規表現の複雑さは、マッチングプロセスの効率に直接影響します。より複雑な正規表現は、特にデータ量が大きい場合、マッチングプロセスを遅くすることができます。 preg_grepのパフォーマンスを改善するために、次のポイントを考慮して、正規表現を簡素化できます。
あまりにも多くのバックトラッキング操作を使用しないでください:バックトラッキング操作は、特に貪欲なパターンを使用する場合(たとえば* )、通常の試合の複雑さを高めます。可能であれば、非グリーディパターン(例:。*? )またはその他の単純なマッチングパターンを使用してみてください。
文字セットの代わりに文字クラスを使用します。たとえば、 [0-9]の代わりに数字を表すために\ dを使用して、一致の計算量を減らすことができます。
複数のキャプチャパケットを避けるようにしてください:キャプチャパケットは、特にキャプチャパケット( (?:...) )を使用してキャプチャを使用する必要がない場合は、追加のコンピューティングとメモリオーバーヘッドを追加します。
時には、ファジーではなく、データを正確に一致させる必要がある場合があります。 。*などの幅広い正規表現を使用しないでください。ただし、特定のパターンを使用してみてください。正確な一致は、通常のエンジンが基準が満たされているかどうかを事前に決定できるため、マッチの速度を大幅に改善します。
たとえば、「ABC」から始まる文字列を見つける必要がある場合は、 。*ABCなどのファジーマッチを使用せずに^ABCを直接使用できます。
preg_grep自体はpreg_offset_captureフラグをサポートしていませんが、特に試合がどこにあるかを知る必要がある場合は、パフォーマンスをさらに向上させたい場合は、 preg_matchまたはpreg_match_allを他の方法で組み合わせることで行うことができます。一致する位置のみをキャプチャし、一致するコンテンツの処理を減らすことにより、時間を節約できます。
大量のデータを処理する場合、配列全体で定期的なマッチング操作を実行する必要がない場合があります。最初にアレイでいくつかのフィルタリングまたはセグメンテーション処理を実行し、次に定期的なマッチングを実行することを検討できます。たとえば、 Array_Filterを最初に使用してArrayを事前にフィルターします。基本的な条件を満たす要素のみが保持され、通常の試合が実行され、一致数を大幅に削減できます。
<span><span><span class="hljs-variable">$array</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_filter</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>, function(</span><span><span class="hljs-variable">$value</span></span><span>) {
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">strlen</span></span><span>(</span><span><span class="hljs-variable">$value</span></span><span>) > </span><span><span class="hljs-number">3</span></span><span>; </span><span><span class="hljs-comment">// 例えば:長さのみを処理します3要素</span></span><span>
});
</span><span><span class="hljs-variable">$matches</span></span><span> = </span><span><span class="hljs-title function_ invoke__">preg_grep</span></span><span>(</span><span><span class="hljs-string">'/pattern/'</span></span><span>, </span><span><span class="hljs-variable">$array</span></span><span>);
</span></span>
PHPが使用する通常のエンジン(PCRE)はすでに非常に強力ですが、パフォーマンスの要件が非常に高い場合は、他の言語で通常のエンジンを使用することも検討したり、ローカルでいくつかの最適化を実行したりすることもできます。たとえば、PythonのREライブラリまたはその他のより効率的な通常のライブラリを使用してデータ処理を使用してから、結果を処理のためにPHPに戻すことができます。
同じデータセットに複数の定期的な一致を行う必要がある場合は、データのキャッシュを検討してください。このようにして、毎回通常の試合を再実行する必要はなく、不必要な計算を減らします。場合によっては、 array_mapやarray_walkなどの関数を使用してデータを前処理することも効率を向上させることができます。
preg_grepはいくつかの目的に非常に役立ちますが、場合によってはpreg_matchまたはpreg_match_allを使用する方が効率的かもしれません。特に、配列全体ではなく1つの要素を一致させる必要がある場合、 preg_matchを使用すると、不要な配列操作が直接削減されます。
例えば:
<span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$array</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$value</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-string">'/pattern/'</span></span><span>, </span><span><span class="hljs-variable">$value</span></span><span>)) {
</span><span><span class="hljs-comment">// 处理匹配到要素</span></span><span>
}
}
</span></span>
定期的なマッチングを行うときは、最初にテストケースを最適化するのが最善です。不必要なマッチングを減らすことにより、効率を向上させることができます。たとえば、特定の特定の形式(日付、電子メールなど)でデータを一致させる場合、最初にStrposやSubstrなどのいくつかの単純な文字列関数を介して条件を満たす可能性のある要素を除外してから、定期的なマッチングを実行できます。