3

preg_quote('<>')これらの文字を正規表現でエスケープする必要があるかどうかを確認するために実行したところ、驚いたことに、それらはエスケープされて戻ってきました: \<\>.

これらの文字をエスケープする必要があるのはなぜですか? 正規表現でのそれらの意味は何ですか?

4

1 に答える 1

8

<
後読み(が前に付いていない(?<!foo)bar一致)を定義するために使用する場合に重要です。barfoo

<とは両方とも>、次のようにサブパターンに名前を付けるために使用されます。

preg_match("/(?<area>\d{3})-(?<sub>\d{3})-(?<num>\d{4})/",$number,$m);
// now elements of the US phone number are in $m['area'], $m['sub'] and $m['num']

そのため、他の記号と組み合わせて使用​​すると意味を持つ可能性があるため、エスケープされます。

ただし、サブパターンの特定の場所以外では意味がないことに注意してください。そのため、手動でエスケープする場合は、ほとんどの場合エスケープする必要はありません。


さらに拡張するには:

ドキュメントには、エスケープされる文字の完全なリストがあります。ここでは、それらの意味とともにリストします。

  • .改行以外の任意の 1 文字に一致 (s修飾子が設定されていない場合)
  • \次の文字をエスケープするか、エスケープ シーケンスを開始します
  • +先行する文字、クラス、またはサブパターンの 1 つ以上に一致
  • *先行する文字、クラス、またはサブパターンの 0 個以上に一致
  • ?前の項目をオプションにします。また、「キャプチャしない」( (?:foo))、「先読み」((?=foo)および(?!foo))、「後読み」((?<=foo)および) などの特別な動作を定義するサブパターンで使用され(?<!foo)、その他にも多くの用途があります。
  • [文字クラスを]定義します。一致する可能性のある文字のセット。他のほとんどのシンボルは、文字クラス内では意味を持ちません。
  • ^文字列の先頭と$末尾をそれぞれ一致させます。修飾子が存在する場合、m個々の行の開始と終了にも一致します。
  • (サブパターンを)定義し、キャプチャのために単独で使用するか、?特別な動作のために使用します。in などの量指定子を適用して、\d{1,3}(?:,\d{3})*1000 区切りの数字に一致させる場合にも役立ちます。
  • {前の項目を}手動で定量化します。コンマで区切られた 1 つまたは 2 つの数字を取ります。たとえば、{3}正確に 3 回{,3}一致する、0 回から 3 回一致する、3 回{3,}以上一致する、3 回{3,8}から 8 回一致する、などがあります。
  • =先読みアサーションで使用:にfoo(?=bar)一致しますfooが、後に が続く場合のみですbar
  • !否定的なルックアラウンド アサーションで使用されfoo(?!bar)ます。foobar
  • <>この質問の件名は、回答の冒頭を参照してください。
  • |可能性のリストを指定する代替。文字クラスのようなものですが、単一の文字ではなくパターン全体を対象としています。foo|bar"foo" または "bar" に一致します。サブパターンでの特別な動作と見なされることもあります:(?|foo(bar)|bar(foo))括弧内のビットがサブパターン 1 になるようにします (そうでない場合、bar一致した場合は 1 に、一致したfoo場合は 2 に、一致しなかったものは空になります)。
  • :サブパターンを非キャプチャにするためにサブパターンで使用されます。基本的に、サブパターンは単に「文字のグループ」になり、通常は数量化されます。(?:foo)"foo" に一致しますが、キャプチャしません。
  • -文字クラス内の文字の範囲を定義します。1 つの外では意味がありません。
于 2013-11-05T16:49:20.483 に答える