我已经运行preg_quote('<>')
来检查这些字符是否需要在正则表达式中进行转义,令我惊讶的是,它们会被转义为\<\>
。
为什么需要转义这些字符?正则表达式中它们的含义是什么?
答案 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)
定义字符类中的一系列字符。除了一个之外没有任何意义。