为什么我们需要逃避! < > := - 在PHP正则表达式?

时间:2011-09-10 14:37:26

标签: php regex web

http://php.net/manual/en/function.preg-quote.php

  

特殊的正则表达式字符是:。 \ + *? [^] $(){   } =! < > | : -

但是this page表示特殊字符为[ \ ^ $ . | ? * + ( )

好的我知道第一页是专门针对php正则表达式的。但是,为什么我们需要逃避!<>:=-

我试图preg_match而没有转义<>-!,而且一切正常。

5 个答案:

答案 0 :(得分:5)

这些字符是元字符,但它们不需要转义。他们的共同点是它们出现在特殊的分组结构中:

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

但他们在这方面只具有特殊意义。因此,如果您获取任何字符串并转义所有这些字符:[\^$.|?*+(){,那么您将得到一个与字符串逐字符完全匹配的正则表达式,因为其他元字符永远不会出现在元上下文中。

例如,如果之前未转义的]打开了一个字符类,[只是一个元字符。

同样,-只是字符类中的元字符,意为“范围”,如[a-z] (或文字-,如[abc-]

因此,要转义字符串[tag-soup],您只需要转义[。在字符类之外,]-只被视为文字。

总之,如果你取一个字符串并转义所有“无条件”元字符([\^$.|?*+(){),那么你得到一个与字符串字符完全匹配的正则表达式。

答案 1 :(得分:4)

您链接的页面标题为“基本正则表达式语法”。有一个标题为"advanced regex syntax"的网页的链接。这里使用了您指定的所有额外字符。

  • !用于负向前瞻和后视镜
  • <用于lookbehinds
  • >用于原子组
  • :用于仅为正则表达式的一部分设置标记
  • =用于积极的前瞻和后瞻
  • -用于字符范围和调整标记

答案 2 :(得分:3)

破折号是角色类中的特殊字符:

[a-zA-Z0-9]

其他人在匹配组中具有重要意义,例如前瞻/后视:

(?<=foo)
(?!bar)

我同意你的意见,这些都不需要逃脱。一旦括号和方括号被转义,这些其他字符就失去了它们的特殊含义。

答案 3 :(得分:1)

这些字符用于负/正后视/前/后表达。例如:

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

有关详细信息,请参阅here

答案 4 :(得分:1)

许多角色仅在特定情境中特殊。从基本的,例子:

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

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

 /!/       # literal
 /(?!...)/ # meta-character