当测试答案时 另一位用户的问题 我发现了一些我不明白的事情。问题是替换所有文字 \t \n \r 带有单个空格的字符串中的字符。

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

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

令人惊讶的是这不起作用。我在 Perl 中尝试了相同的模式,效果很好。经过一番尝试和错误后,我发现 PHP 需要 3 或 4 个反斜杠来匹配该模式,如下所示:

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

或者

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

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

有帮助吗?

解决方案

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

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

从 PHP 文档中,

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

因此对于 \\\[,

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

是的,它有效,但不是一个好的做法。

其他提示

及其在Perl作品因为你传递直接作为正则表达式模式/(?:\\[trn])+/

但在PHP中,你需要传递的字符串,所以需要额外的转义反斜线本身。

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

在正则表达式\匹配单个   反斜杠将成为“/ \\\\ /”作为    PHP预浸料串

在正则表达式的就是只是/(?:\\[trn])+/。但既然你一定要逃逸字符串声明以及反斜线,每个反斜线必须用\\表示:

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

就在三退格键也做的工作,因为PHP不知道转义序列\[并忽略它。所以\\将成为\\[会留\[

使用str_replace函数!

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

应达到目的

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top