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); 
应该做的伎俩