在测试another user's question的答案时,我发现了一些我不理解的东西。问题是用一个空格替换字符串中的所有文字\t
\n
\r
字符。
现在,我尝试的第一个模式是:
/(?:\\[trn])+/
令人惊讶的是没有用。我在Perl中尝试了相同的模式,它运行良好。经过一些反复试验后,我发现PHP需要3个或4个反斜杠才能匹配该模式,如:
/(?:\\\\[trn])+/
或
/(?:\\\[trn])+/
这些模式 - 令我惊讶 - 两者都有效。为什么需要这些额外的反斜杠?
答案 0 :(得分:12)
你需要4个反斜杠来表示正则表达式中的1,因为:
"\\\\" -> \\
)\\ -> \
)来自PHP文档,
转义任何其他字符也会导致反斜杠被打印 1
因此\\\[
,
\
,因为\[
无效("\\\[" -> \\[
)\\[ -> \[
)是的,它有效,但不是一种好的做法。
答案 1 :(得分:8)
它在perl中工作,因为你直接将它传递为正则表达式模式/(?:\\[trn])+/
但是在php中,你需要传递为字符串,所以需要额外的转义为反斜杠本身。
"/(?:\\\\[trn])+/"
正则表达式\匹配单个 反斜杠会成为'/ \\\\ /' PHP preg string
答案 2 :(得分:2)
正则表达式 只是/(?:\\[trn])+/
。但是因为你需要在字符串声明中转义反斜杠,所以每个反斜杠必须用\\
表示:
"/(?:\\\\[trn])+/"
'/(?:\\\\[trn])+/'
只有三个退格也可以工作,因为PHP不知道转义序列\[
并忽略它。因此\\
将成为\
,但\[
将保持\[
。
答案 3 :(得分:-2)
使用str_replace!
$code = str_replace(array("\t","\n","\r"),'',$code);
应该做的伎俩