繁体   English   中英

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

[英]Extra backslash needed in PHP regexp pattern

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

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

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

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

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

要么

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

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

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

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

从PHP文档中,

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

因此,对于\\\\\\[

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

是的,它是可行的,但不是一种好的做法。

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

但是在php中,您需要以字符串形式传递,因此反斜杠本身需要额外的转义。

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

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

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

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

因为PHP不知道转义序列\\[并忽略它,所以只有三个退格键也起作用。 因此\\\\将变为\\\\[将保持\\[

使用str_replace!

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

应该做的把戏

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM