PHP 開発における正規表現の使用を最適化する方法
PHP 開発では、正規表現は文字列の一致、検索、置換を処理するための強力で一般的に使用されるツールです。ただし、正規表現のパフォーマンスは開発者によって見落とされることが多く、プログラムの動作が非効率になる可能性があります。この記事では、PHP 開発における正規表現の使用を最適化し、開発者がその利点を最大限に発揮してプログラムのパフォーマンスを向上させるのに役立ついくつかの方法を紹介します。
1. 最も単純なモードを使用する
正規表現を使用するときは、最も単純なモードを使用することを常に考慮する必要があります。単純なパターンは、必要な計算と照合のステップが少ないため、一般にパフォーマンスが高くなります。ネストされたグループ化、ルックバック、否定的な先読みなどの複雑なパターンの使用は避けてください。
2. 貪欲でない量指定子を使用する
正規表現内の量指定子は、パターンが出現できる回数を指定します。デフォルトでは、量指定子は貪欲です。つまり、できるだけ多くの文字列と一致します。ただし、貪欲な量指定子は場合によってはパフォーマンスの低下につながる可能性があります。パフォーマンスを向上させるために、可能な限り少数の文字列と一致する非貪欲量指定子を使用できます。
たとえば、a で始まり任意の文字で終わる文字列と一致する必要がある場合は、正規表現 /a.*$/
を使用できます。ここの量指定子 # は貪欲であり、可能な限り多くの文字と一致します。文字列が長い場合、一致に時間がかかります。パフォーマンスを向上させるために、貪欲でない数量子
/a.*?$/
を使用すると、可能な限り少数の文字と一致するため、一致時間が短縮されます。
3. プリコンパイルされた正規表現を使用する
PHP では、正規表現を preg_match()
、preg_replace()
などの関数を通じて渡すことができます。実行。これらの関数が呼び出されるたびに、PHP は正規表現をコンパイルし、照合を実行します。コード内で同じ正規表現を複数回実行すると、不必要なコンパイルと照合のオーバーヘッドが発生します。パフォーマンスを向上させるために、preg_match()
関数の PREG_PATTERN_ORDER
パラメーターを使用して正規表現をプリコンパイル済み形式にコンパイルし、後続の呼び出しでそれを再利用できます。
たとえば、テキスト内で複数出現する日付を一致させる必要があるとします。以下に示すように、日付の正規表現はプリコンパイルされた形式にコンパイルされ、その後の照合で再利用できます。
$pattern = '/d{4}-d{2}-d{2}/'; $text = "Today is 2022-01-01. Tomorrow is 2022-01-02."; preg_match($pattern, $text, $matches); echo $matches[0]; // 输出:2022-01-01 preg_match($pattern, $text, $matches); echo $matches[0]; // 输出:2022-01-02
プリコンパイルされた正規表現を使用すると、複数のコンパイルのオーバーヘッドを回避し、照合効率を向上させることができます。
4. 不要なロケーターを避ける
正規表現では、一致する位置を制限するためにロケーター (アンカー) が使用されます。一般的に使用されるロケーターには、# (行の先頭と一致)、
$
(行の末尾と一致)、および
(単語の境界と一致) があります。ただし、不要なロケーターにより正規表現が複雑になり、パフォーマンスが低下します。
正規表現を作成するときは、不要なロケーターを避け、それらを使用する必要があるかどうかを慎重に評価する必要があります。位置を制限する必要がない場合は、ロケーターを省略して、正規表現を簡素化できます。
5. バックトラッキングの使用を最小限に抑える
バックトラッキングは、不確実な一致を処理するために使用される正規表現のメカニズムです。正規表現が文字列と一致しない場合、最適な一致が見つかるまで、さまざまな一致パスが試行されます。ただし、バックトラッキングを使用すると、特に複雑な正規表現や長い文字列の場合、パフォーマンスが低下する可能性があります。
正規表現のパフォーマンスを最適化するには、バックトラッキングの使用を最小限に抑える必要があります。バックトラッキングは、貪欲でない量指定子を使用し、ネストされたグループ化を回避し、一致範囲を制限することによって回避できます。さらに、*?
、 ?
、??
など、できるだけ少ない文字に一致する貪欲な量指定子の遅延形式を使用できるため、バックトラッキングが発生します。
6. マッチングの代わりにセグメンテーションを使用する
場合によっては、正規表現の置換操作によりパフォーマンスが低下する可能性があります。文字列の内容を置換せずに文字列を分割するだけの場合は、正規表現による置換操作よりも効率的な explode()
関数の使用を検討できます。
7. ネイティブ文字列を使用する
PHP では、通常、正規表現は二重引用符で囲まれた文字列で使用されます。二重引用符で囲まれた文字列はエスケープ文字を解析するため、正規表現が解析の影響を受けないようにするには、ネイティブ文字列を使用する必要があります。
ネイティブ文字列は、文字列の前に @
記号を追加することで表現できます (例: $pattern = '@d @'
)。ネイティブ文字列を使用すると、エスケープ文字の解析によって発生するエラーやパフォーマンスの低下を回避できます。
結論
PHP 開発における正規表現の使用を最適化することは、プログラムのパフォーマンスを向上させるために重要です。最も単純なパターン、貪欲でない量指定子、プリコンパイルされた正規表現を使用し、不要なロケーターを回避し、バックトラッキングの使用を最小限に抑え、マッチングの代わりに分割を使用し、ネイティブ文字列を使用することにより、正規表現を最大限に活用できます。 。開発者は、特定のニーズとシナリオに基づいて正規表現の効率を向上させる適切な最適化方法を選択する必要があります。
以上がPHP 開発における正規表現の使用を最適化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。