我们为什么要逃避现实<>;:=-在php正则表达式中?
: 特殊的正则表达式字符是:.\+*?[ ^ ] $ ( ) { } = ! < > | : - 但是,表示特殊字符是我们为什么要逃避现实<>;:=-在php正则表达式中?,php,regex,web,Php,Regex,Web,: 特殊的正则表达式字符是:.\+*?[ ^ ] $ ( ) { } = ! < > | : - 但是,表示特殊字符是[\^$.|?*+() 好的,我知道第一页是专门关于php正则表达式的。但是为什么我们需要避开!,,:,=,- 我尝试进行预匹配而没有转义,-和!,一切都很正常。您链接到的页面标题为“基本正则表达式语法”。有一个链接指向标题为的页面。这里使用了您指定的所有额外字符 !用于负面的lookahead和lookbehind 用于原子组 :仅用于为正则表达式的一部分设置标志 =用于正面
[\^$.|?*+()
好的,我知道第一页是专门关于php正则表达式的。但是为什么我们需要避开!
,
,:
,=
,-
我尝试进行
预匹配
而没有转义
,-
和!
,一切都很正常。您链接到的页面标题为“基本正则表达式语法”。有一个链接指向标题为的页面。这里使用了您指定的所有额外字符
用于负面的lookahead和lookbehind!
用于原子组
仅用于为正则表达式的一部分设置标志:
用于正面lookahead和lookbehind=
用于字符范围和调整标志-
/^foo(?<!z)bar$/
/^foo(?)?
有关详细信息,请参阅。这些字符是元字符,但不需要转义。它们的共同点是它们出现在特殊的分组结构中:
(?:...) # non-capturing group
(?=...) # positive lookahead
(?!...) # negative lookahead
(?<name>...) # named capturing groups
(?<=...) # positive lookbehind
(?<!...) # negative lookbehind
(?>...) # atomic group
(?:…)#非捕获组
(?=…)#积极前瞻
(?!…)#消极前瞻
(?…)#命名捕获组
(?
但是它们在这个上下文中只有一个特殊的意义。因此,如果你接受任何字符串并转义所有这些字符:[\^$.\124;?*+(){
,那么你会得到一个正则表达式,它将精确地逐字符匹配字符串,因为其他元字符永远不会在元上下文中
例如,]
仅当先前有一个未扫描的[
打开了一个字符类时才是元字符
类似地,-
只是字符类中的一个元字符,在[a-z]
中表示“范围”(或在[abc-]
中表示文字-
)
因此,要转义字符串[tag soup]
只需转义[
。在字符类之外,]
和-
被简单地视为文本
总之,如果您获取一个字符串并转义所有“无条件”元字符([\^$.|?*+(){
),那么您将得到一个正则表达式,该正则表达式将精确地逐字符匹配字符串。破折号是字符类中的一个特殊字符:
[a-zA-Z0-9]
其他选项在比赛组中具有重要意义,例如,对于“向前看/向后看”:
(?<=foo)
(?!bar)
(?许多字符仅在特定上下文中是特殊的。从基本字符中,有几个示例:
/-/ # dash
/[a-z]/ # range
/[-a-z]/ # a-z or dash
/[^]/ # literal
/^/ # meta-character
/!/ # literal
/(?!...)/ # meta-character
但是为什么我们需要逃逸它们?为什么preg\u quote
逃逸它们?即使我没有逃逸它们,一切都很好。@Pacerier,因为您可能只插入了正则表达式的一部分。出现问题的情况非常模糊,但并非不可想象。您能举一个例子吗(可能有疑问编辑thx)不转义!或怎么会失败?因为是的,这对我来说现在是不可想象的。如果他们不需要转义,为什么preg\u quote
会转义?有什么问题吗?听起来有点过分热情。如果你的输入字符串是(?:)
,那么(\?:\)
将是正确的转义版本。\(\?\:\)
可能不会有什么坏处,因为在许多正则表达式风格中,未知的转义序列会被忽略,但有些会触发错误,所以通常最好不要超出需要进行转义。有没有哪种情况不转义会导致任何失败?或者假设它不会100%失败是安全的。没有,这是安全的。我添加了{
到“待转义”字符列表中,这些字符已丢失,但就这样。如果不需要转义,为什么preg_quote
会转义它们?有什么陷阱?没有陷阱。这些字符不需要转义。编写该方法的人只是过于热情。