Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我们为什么要逃避现实<>;:=-在php正则表达式中?_Php_Regex_Web - Fatal编程技术网

我们为什么要逃避现实<>;:=-在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
会转义它们?有什么陷阱?没有陷阱。这些字符不需要转义。编写该方法的人只是过于热情。