PHP正则表达式模式中需要额外的反斜杠

时间:2010-01-27 09:47:25

标签: php regex pcre

在测试another user's question的答案时,我发现了一些我不理解的东西。问题是用一个空格替换字符串中的所有文字\t \n \r字符。

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

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

令人惊讶的是没有用。我在Perl中尝试了相同的模式,它运行良好。经过一些反复试验后,我发现PHP需要3个或4个反斜杠才能匹配该模式,如:

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

/(?:\\\[trn])+/
这些模式 - 令我惊讶 - 两者都有效。为什么需要这些额外的反斜杠?

4 个答案:

答案 0 :(得分:12)

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

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

来自PHP文档,

  

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

因此\\\[

  • 1反斜杠用于取消隐藏\,因为\[无效("\\\[" -> \\[
  • 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);

应该做的伎俩