为什么<和>需要以preg _ *()模式进行转义?

时间:2013-11-05 16:45:41

标签: php regex preg-match

我已经运行preg_quote('<>')来检查这些字符是否需要在正则表达式中进行转义,令我惊讶的是,它们会被转义为\<\>

为什么需要转义这些字符?正则表达式中它们的含义是什么?

1 个答案:

答案 0 :(得分:8)

<在用于定义lookbehinds时具有重要意义 ((?<!foo)bar匹配bar之前没有的foo

<>都用于命名子模式,如下所示:

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']

因此,因为它们与其他符号一起使用时具有重要意义,所以它们会被转义。

但是,应该注意的是,它们在子模式中的特定位置之外没有任何意义,因此如果您手动转义,则很可能不需要转义它们。


进一步扩展:

The documentation包含已转义的完整字符列表。在这里,我将列出它们及其含义。

  • .匹配除换行符之外的任何单个字符(除非设置了s修饰符)
  • \转义以下字符,或开始转义序列
  • +匹配前面一个或多个字符,类或子模式
  • *匹配前面的字符,类或子模式中的零个或多个
  • ?使前一项可选,也在子模式中用于定义特殊行为,例如“不捕获”((?:foo)),“lookahead”((?=foo)和{{ 1}}),“lookbehind”((?!foo)(?<=foo)),以及其他许多用途。
  • (?<!foo)[定义一个字符类,即。一组可以匹配的字符。大多数其他符号在字符类中没有意义。
  • ]^分别匹配字符串的开头和结尾。如果存在$修饰符,它还会匹配各行的开头和结尾。
  • m(定义一个子模式,单独用于捕获或用)表示特殊行为。对于应用量词也很有用,例如在?中匹配千位分隔的数字。
  • \d{1,3}(?:,\d{3})*{手动量化上一项。取一个或两个数字,用逗号分隔。示例包括}恰好匹配三次,{3}匹配0到3次,{,3}匹配三次或更多次,{3,}匹配三到八次。
  • {3,8}用于前瞻断言:=匹配foo(?=bar),但前提是后跟foo
  • bar用于负面的外观断言:!匹配foo(?!bar),但如果后面跟foo则不匹配。
  • bar<此问题的主题,请参阅信息答案的开头。
  • >轮替,指定可能性列表。它有点像一个字符类,但对于整个模式而不是单个字符。 |匹配“foo”或“bar”。也可以看作子模式中的特殊行为:foo|bar确保括号中的任何位都在子模式1中(否则,(?|foo(bar)|bar(foo))如果匹配则为1,bar将如果匹配则为2,而不匹配的则为空)
  • foo在子模式中使用以使它们不被捕获。从本质上讲,子模式只是变成一组“字符”,通常会被量化。 :匹配但不捕获“foo”。
  • (?:foo)定义字符类中的一系列字符。除了一个之外没有任何意义。