7

在测试另一个用户问题的答案时,我发现了一些我不明白的东西。问题是\t \n \r用一个空格替换字符串中的所有文字字符。

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

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

令人惊讶的是没有用。我在 Perl 中尝试了相同的模式并且效果很好。经过反复试验,我发现 PHP 需要 3 或 4 个反斜杠来匹配该模式,如下所示:

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

或者

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

这些模式——令我惊讶的是——都有效。为什么需要这些额外的反斜杠?

4

4 回答 4

12

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

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

从 PHP 文档,

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

因此对于\\\[,

  • 1个反斜杠用于取消转义\,1个因为\[无效而留下("\\\[" -> \\[
  • 1 个反斜杠用于在正则表达式引擎中进行转义 ( \\[ -> \[)

是的,它有效,但不是一个好习惯。

于 2010-01-27T09:51:01.747 回答
8

它在 perl 中有效,因为您将其直接作为正则表达式模式传递/(?:\\[trn])+/

但是在 php 中,您需要作为字符串传递,因此需要对反斜杠本身进行额外的转义。

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

匹配单个反斜杠的正则表达式 \ 将变为 '/\\\\/' 作为 PHP preg 字符串

于 2010-01-27T09:53:54.183 回答
2

正则表达式只是/(?:\\[trn])+/. 但是由于您还需要在字符串声明中转义反斜杠,因此每个反斜杠必须用 表示\\

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

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

于 2010-01-27T09:51:41.080 回答
-2

使用 str_replace!

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

应该做的伎俩

于 2010-01-27T09:58:35.257 回答