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