2011-09-10 12 views
10

http://php.net/manual/en/function.preg-quote.phpなぜ私たちはエスケープする必要がありますか? < >:= - PHPの正規表現では?

正規表現の特殊文字は次のとおりです。 \ + *? [^] $(){ } =! <> | : -

しかしthis pageは特殊文字は、私が最初のページには、PHPの正規表現に、具体的であることを知って[OK]を[ \^$ . | ? * + ()

であることを述べています。しかし、なぜ私たちはエスケープする必要がありますか?!<>:=-

私は<>-!を脱出し、すべてが完璧に働いているなしpreg_matchを実行しようとしました。

答えて

5

これらの文字はメタキャラクタですが、エスケープする必要はありません。

(?:...)  # non-capturing group 
(?=...)  # positive lookahead 
(?!...)  # negative lookahead 
(?<name>...) # named capturing groups 
(?<=...)  # positive lookbehind 
(?<!...)  # negative lookbehind 
(?>...)  # atomic group 

しかし、彼らは唯一、この文脈では特別な意味に取る:彼らが共通しているのかは、彼らが構築特別なグループ化で発生するということです。だから文字列をとり、これらすべての文字をエスケープすると:[\^$.|?*+(){、文字列ごとに完全に一致する正規表現を得ることができます。なぜなら、他のメタ文字は決してメタコンテキスト内に存在しないからです。

たとえば、]は、文字クラスを開いた前のエスケープされていない[があった場合のメタキャラクターに過ぎません。

同様に、-[a-z](又は[abc-]と同様リテラル-のように「範囲」を意味する、文字クラスにのみメタ文字です。

文字列[tag-soup]をエスケープするには、[をエスケープする必要があります。文字クラスの外側では、]-は単にリテラルとして扱われます。

要約すると、文字列を受け取り、すべての「無条件」メタキャラクタ([\^$.|?*+(){)をエスケープすると、文字列ごとに文字列と正確に一致する正規表現が得られます。

+0

エスケープする必要がない場合、 'preg_quote'がエスケープするのはなぜですか?キャッチは何ですか? – Pacerier

+0

私は少し過激に聞こえる。入力文字列が '(?:)'の場合、 '\(\?:\)'は正しくエスケープされたバージョンになります。 '\(\?\:\)'はおそらく害はないでしょう。多くの正規表現のフレーバーでは、未知のエスケープシーケンスは単に無視されますが、いくつかはエラーを引き起こすので、通常は必要以上にエスケープしないことをお勧めします。 –

+0

はエスケープしないと1つの状況になっても何も失敗する可能性がありますか?またはそれが100%失敗しないと仮定することは安全です。 – Pacerier

4

あなたがリンクしているページのタイトルは「基本正規表現の構文」です。 "advanced regex syntax"というタイトルのページへのリンクがあります。ここで指定した余分な文字がすべて使用されます。

  • !は負先読みのために使用され、
  • <をlookbehinds lookbehinds
  • >ために使用される
  • :が正規表現
  • のセクションのみのフラグを設定するために使用される原子団のために使用されます=は、肯定先読みおよびルックアヘッドに使用されます。
  • -は、文字r角度と調整フラグ
+0

しかし、なぜそれらをエスケープする必要がありますか?なぜ 'preg_quote'がそれらをエスケープするのですか?私はそれらをエスケープしていませんでしたが、すべてうまく動作しています。 – Pacerier

+0

@Pacerier正規表現の一部だけを挿入している可能性があるためです。それが問題になる状況はかなり不明瞭ですが、想像もできません。 – lonesomeday

+0

あなたはエスケープしないように1つの例を与えることができますか?または< or >が失敗するでしょうか?はい、私にとっては今のところ想像がつかないからです。 – Pacerier

1

これらの文字は、ネガティブ/ポジティブルック・ビハインド/先読み/前後の式で使用されます。例:

/^foo(?<!z)bar$/ 

詳細については、hereを参照してください。

3

ダッシュは文字クラス内の特殊文字である:

[a-zA-Z0-9] 

他の人が先読みのために、たとえば、一致グループ内の重要性を持っている/後読み:

私がどれことをあなたに同意
(?<=foo) 
(?!bar) 

これらはエスケープする必要があります。かっこと大括弧がエスケープされると、これらの他の文字は特別な意味を失います。

+0

エスケープする必要がない場合、 'preg_quote'がエスケープするのはなぜですか?キャッチは何ですか? – Pacerier

+0

キャッチはありません。これらの文字はエスケープする必要はありません。その方法を書いた人は、あまりにも熱狂的でした。 –

1

多くの文字は特定のコンテキストでのみ特殊です。基本的な例から、いくつかの例:

/-/  # dash 
/[a-z]/ # range 
/[-a-z]/ # a-z or dash 

/[^]/  # literal 
/^/  # meta-character 

/!/  # literal 
/(?!...)/ # meta-character 
関連する問題