我跑去preg_quote('<>')
检查这些字符是否需要在正则表达式中转义,令我惊讶的是,他们回来了 escaped: \<\>
。
为什么这些字符需要转义?它们在正则表达式中的含义是什么?
我跑去preg_quote('<>')
检查这些字符是否需要在正则表达式中转义,令我惊讶的是,他们回来了 escaped: \<\>
。
为什么这些字符需要转义?它们在正则表达式中的含义是什么?
<
用于定义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']
因此,因为它们在与其他符号一起使用时可能具有重要意义,所以它们被转义了。
然而,应该注意的是,它们在子模式中的特定位置之外没有任何意义,因此如果您手动转义,您很可能不需要转义它们。
进一步扩展:
该文档有一个完整的转义字符列表。在这里,我将列出它们以及它们的含义。
.
匹配除换行符以外的任何单个字符(除非s
设置了修饰符)\
转义以下字符,或开始转义序列+
匹配一个或多个前面的字符、类或子模式*
匹配零个或多个前面的字符、类或子模式?
使前一项成为可选项,也用于子模式中以定义特殊行为,例如“不捕获” (?:foo)
((?=foo)
(?!foo)
(?<=foo)
(?<!foo)
[
并]
定义一个字符类,即。一组可以匹配的字符。大多数其他符号在字符类中没有意义。^
并$
分别匹配字符串的开头和结尾。当m
修饰符存在时,它还匹配各行的开始和结束。(
和)
定义一个子模式,单独用于捕获或?
用于特殊行为。对于应用量词也很有用,例如\d{1,3}(?:,\d{3})*
匹配千位分隔的数字。{
和}
手动量化前一项。接受一个或两个数字,用逗号分隔。示例包括{3}
精确匹配 3 次、{,3}
匹配 0 到 3 次、{3,}
匹配 3 次或更多次以及{3,8}
匹配 3 到 8 次。=
在前瞻断言中使用:foo(?=bar)
匹配foo
,但仅当它后跟bar
.!
用于否定环视断言:foo(?!bar)
匹配foo
,但如果后面跟着. 则不匹配bar
。<
和>
此问题的主题,请参阅答案的开头以获取信息。|
交替,指定可能性列表。它有点像一个字符类,但用于整个模式而不是单个字符。foo|bar
匹配“foo”或“bar”。也可以被视为子模式中的一种特殊行为:(?|foo(bar)|bar(foo))
确保括号中的任何位都将在子模式 1 中(否则,bar
如果匹配则在 1 中,如果匹配foo
则在 2 中,不匹配的位将为空):
在子模式中使用以使它们不被捕获。本质上,子模式只是变成了一个“字符组”,通常会被量化。(?:foo)
匹配但不捕获“foo”。-
定义字符类中的字符范围。除了一个之外没有任何意义。