PHP正则expression式模式需要额外的反斜杠

当testing另一个用户的问题的答案时,我发现了一些我不明白的东西。 问题是用一个空格replacestring中的所有字符\t \n \r字符。

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

 /(?:\\[trn])+/ 

这令人惊讶的没有工作。 我在Perl中尝试了相同的模式,它工作正常。 经过一些试验和错误,我发现PHP需要3或4反斜杠模式匹配,如:

 /(?:\\\\[trn])+/ 

要么

 /(?:\\\[trn])+/ 

这些模式 – 令我惊讶 – 都工作。 为什么这些额外的反斜杠是必要的?

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

  • 2个反斜杠用于在string中转义( "\\\\" -> \\
  • 在正则expression式引擎中使用1个反斜杠( \\ -> \

从PHP文档中,

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

因此对于\\\[

  • 一个反斜杠用于消除\ ,一个逗留,因为\[无效( "\\\[" -> \\[
  • 1反斜杠用于在正则expression式引擎中进行修复( \\[ -> \[

是的,它的工作,但不是一个好的做法。

它在Perl中的作品,因为你直接将它作为正则expression式模式/(?:\\[trn])+/

但在PHP中,你需要传递string,所以需要额外的反斜杠本身。

 "/(?:\\\\[trn])+/" 

匹配单个反斜杠的正则expression式\会变成'/ \\\\ /'作为PHP pregstring

正则expression式只是/(?:\\[trn])+/ 。 但是既然你需要在string声明中避开反斜杠,每个反斜杠都必须用\\表示:

 "/(?:\\\\[trn])+/" '/(?:\\\\[trn])+/' 

只有三个退格也可以工作,因为PHP不知道转义序列\[并忽略它。 所以\\将成为\\[将保持\[

使用str_replace!

 $code = str_replace(array("\t","\n","\r"),'',$code); 

应该做的伎俩