如何正确逃生反斜线匹配单引号和双引号PHP正则表达式模式的反斜线如何正确逃生反斜线匹配单引号和双引号

2019-05-12 07:57发布

要匹配一个反斜杠,很多人都和PHP手册中说:始终三重逃避它,这样\\\\

注意

单,双引号PHP字符串有反斜杠的特殊意义。 因此,如果\具有与正则表达式匹配\\ ,然后"\\\\"'\\\\'必须在PHP代码中使用。

下面是一个例子字符串: \test

$test = "\\test"; // outputs \test;

// WON'T WORK: pattern in double-quotes double-escaped backslash
#echo preg_replace("~\\\t~", '', $test); #output -> \test

// WORKS: pattern in double-quotes with triple-escaped backslash
#echo preg_replace("~\\\\t~", '', $test); #output -> est

// WORKS: pattern in single-quotes with double-escaped backslash
#echo preg_replace('~\\\t~', '', $test); #output -> est

// WORKS: pattern in double-quotes with double-escaped backslash inside a character class
#echo preg_replace("~[\\\]t~", '', $test); #output -> est

// WORKS: pattern in single-quotes with double-escaped backslash inside a character class
#echo preg_replace('~[\\\]t~', '', $test); #output -> est

结论

  • 如果该模式是单引号,反斜线必须是双重逸出\\\匹配文字\
  • 如果图案是双引号的,它依赖于反弹是否是一个字符类内它必须至少两次转义\\\一个字符类它必须是三逃脱外\\\\

谁可以告诉我一个差异,其中一个单引号的图案如双反斜线转义'~\\\~'将匹配什么比在一个双引号的图案如三转义反斜线不同"~\\\\~"或失败。

当/为什么/在什么情况下会是错误的使用双转义\在单引号模式如'~\\\~'匹配一个反斜杠?

如果没有回答这个问题,我会继续为始终使用双反斜线转义\\\在单引号PHP正则表达式匹配一个文字\ ,因为可能没有什么不妥的地方。

Answer 1:

反斜线( \ )被认为是双方PHP解析器和正则表达式引擎(PCRE)转义字符。 如果你写一个反斜杠字符,它会被视为由PHP解析器转义字符。 如果你写两个反斜杠,它将被解释为PHP解析器反斜线。 但在正则表达式中使用时,正则表达式引擎将它拾起作为转义字符。 为了避免这种情况,你需要写四篇反斜杠字符,这取决于你如何引用模式。

要了解这两种类型的报价模式之间的区别,考虑以下两个var_dump()语句:

var_dump('~\\\~');
var_dump("~\\\\~");

输出:

string(4) "~\\~"
string(4) "~\\~"

转义序列\~在PHP没有特殊意义,当它在一个单引号字符串的二手。 三个反斜杠也做工作,因为PHP解析器不知道转义序列\~ 所以\\将成为\但是\~仍将为\~

你应该使用哪一个:

为了清楚起见,我总是用~\\\\~当我想匹配一个反斜杠。 另一位工作过,但我觉得~\\\\~更为清晰。



Answer 2:

有在PHP无论是单或双引号中的字符串斜线的实际转义没有区别 - 只要你这样做是正确的。 为什么你要在你的第一个例子不会工作的原因是,在评论中指出,它扩展\ t输出给标签元字符。

当你只使用三个反斜杠,最后一个你的单引号字符将被解释为\〜,这只要单引号串去,会留下,因为它是(因为它不符合一个有效的转义序列) 。 然而仅仅是一个巧合,当你在这种情况下,预计这将被解析,而不是有某种副作用(即\\\”不会行为相同的方式)。

之所以要转义的是,正则表达式还需要反斜杠在某些情况下逃脱了,因为他们有特殊的含义有作为。 这导致了后对方的大个反斜线,如\\\\(这需要八个反斜线的降价解析器,因为它再次逃脱增加了另一个层次的)。

希望这清除它,你似乎就反斜杠的单/双引号的字符串不是在正则表达式本身的行为(这将是相同的多个处理混淆不分“或”,只要你逃脱的东西正确)。



文章来源: How to properly escape a backslash to match a literal backslash in single-quoted and double-quoted PHP regex patterns