PHP regexp模式中需要额外的反斜杠

Mat*_*iva 7 php regex pcre

当测试另一个用户的问题的答案时,我发现了一些我不理解的东西.问题是\t \n \r用一个空格替换字符串中的所有文字字符.

现在,我尝试的第一个模式是:

/(?:\\[trn])+/
Run Code Online (Sandbox Code Playgroud)

这令人惊讶地无法奏效.我在Perl中尝试了相同的模式,它运行良好.经过一些试验和错误后,我发现PHP需要3个或4个反斜杠才能匹配该模式,如:

/(?:\\\\[trn])+/
Run Code Online (Sandbox Code Playgroud)

要么

/(?:\\\[trn])+/
Run Code Online (Sandbox Code Playgroud)

这些模式 - 令我惊讶 - 都是有效的.为什么需要这些额外的反斜杠?

ken*_*ytm 12

在正则表达式中需要4个反斜杠来表示1,因为:

  • 2个反斜杠用于字符串中的unescaping("\\\\" -> \\)
  • 1个反斜杠用于在正则表达式引擎中进行unescaping(\\ -> \)

从PHP文档,

转义任何其他字符将导致反斜杠被打印1

因此\\\[,

  • 1个反斜杠用于取消\,因为\[无效("\\\[" -> \\[)
  • 1个反斜杠用于在正则表达式引擎中进行unescaping(\\[ -> \[)

是的它有效,但不是一个好的做法.


YOU*_*YOU 8

它在perl中工作,因为你直接将其作为正则表达式传递 /(?:\\[trn])+/

但在php中,你需要传递为字符串,所以需要额外的转义为反斜杠本身.

"/(?:\\\\[trn])+/"
Run Code Online (Sandbox Code Playgroud)

匹配单个反斜杠的正则表达式\将成为'/ \\\\ /'作为 PHP preg字符串