[英]Extra backslash needed in PHP regexp pattern
测试另一个用户的问题的答案时,我发现了一些我不理解的东西。 问题是用单个空格替换字符串中的所有文字\\t
\\n
\\r
字符。
现在,我尝试的第一个模式是:
/(?:\\[trn])+/
令人惊讶的是,这没有用。 我在Perl中尝试了相同的模式,但效果很好。 经过一番尝试和错误后,我发现PHP希望该模式匹配3或4个反斜杠,如下所示:
/(?:\\\\[trn])+/
要么
/(?:\\\[trn])+/
这些模式-令我惊讶的-都有效。 为什么需要这些额外的反斜杠?
您需要4个反斜杠来表示正则表达式中的1个,因为:
"\\\\\\\\" -> \\\\
) \\\\ -> \\
)中转义 从PHP文档中,
转义任何其他字符将导致反斜杠也被打印出来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.