如何正确地转义反斜杠以匹配单引号和双引号PHP正则表达式模式中的文字反斜杠

时间:2013-12-28 19:08:04

标签: php regex preg-replace

为了匹配字面反斜杠,很多人和the PHP manual说:总是三重逃避它,就像这样\\\\

  

注意

     

单引号和双引号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正则表达式模式中使用双重转义反斜杠\\\来匹配文字\,因为可能没有任何问题它

2 个答案:

答案 0 :(得分:9)

反斜杠字符(\)被PHP的解析器和正则表达式引擎(PCRE)视为转义字符。如果您编写一个反斜杠字符,它将被PHP解析器视为转义字符。如果你写两个反斜杠,它将被PHP的解析器解释为文字反斜杠。但是当在正则表达式中使用时,正则表达式引擎会将其作为转义字符进行选择。为避免这种情况,您需要编写四个反斜杠字符,具体取决于您引用模式的方式。

要理解两种类型的引用模式之间的区别,请考虑以下两个var_dump()语句:

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

输出:

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

转义序列\~在单引号字符串中使用时在PHP中没有特殊含义。三个反斜杠也可以工作,因为PHP解析器不知道转义序列\~。因此\\将成为\,但\~将保持为\~

您应该使用哪一个:

为清楚起见,当我想匹配文字反斜杠时,我总是使用~\\\\~。另一个也有效,但我认为~\\\\~更清楚。

答案 1 :(得分:3)

在PHP中单引号或双引号字符串中斜杠的实际转义之间没有区别 - 只要你做的正确。你在第一个例子中获得WONT WORK的原因是,正如评论中指出的那样,它会扩展到选项卡元字符。

当你只使用三个反斜杠时,单引号字符串中的最后一个将被解释为\〜,就单引号字符串而言,将保持不变(因为它与有效字符不匹配)逃脱序列)。然而,巧合的是,在这种情况下,这将按照您的预期进行解析,而不会产生某种副作用(即,\\\'的行为方式不同)。

所有转义的原因是正则表达式还需要在某些情况下转义的反斜杠,因为它们在那里也有特殊含义。这会导致相互之后出现大量的反斜杠,例如\\\\(对于降价解析器需要8个反斜杠,因为它再次增加了另一个转义级别)。

希望清除它,因为你似乎对单/双引号字符串中反斜杠的处理比正则表达式本身的行为更加困惑(无论“或”如何都是相同的,只要你正确地逃避了事情。)