首页 文章

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

提问于
浏览
5

要匹配字面反斜杠,很多人和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

Conclusion

  • 如果模式是单引号,则反斜杠必须双重转义 \\\ 以匹配文字\

  • 如果模式是双引号,则取决于反向是否在字符类中,它必须至少双重转义 \\\ 在字符类之外它必须进行三重转义 \\\\

谁可以向我展示一个区别,例如单引号模式中的双重反斜杠,例如: '~\\\~' 将匹配任何不同于双引号模式中的三重转义反斜杠,例如 "~\\\\~" 或失败 .

何时/为什么/在什么情况下使用单引号模式中的双重转义 \ 是错误的,例如 '~\\\~' 用于匹配文字反斜杠?

如果对这个问题没有答案,我会继续在单引号的PHP正则表达式模式中使用双重转义反斜杠 \\\ 来匹配文字 \ ,因为它可能没有任何问题 .

2 回答

  • 3

    PHP 's parser and the regular expression engine (PCRE). If you write a single backslash character, it will be considered as an escape character by PHP parser. If you write two backslashes, it will be interpreted as a literal backslash by PHP'解析器将反斜杠字符( \ )视为转义字符 . 但是当在正则表达式中使用时,正则表达式引擎会将其作为转义字符进行选择 . 为避免这种情况,您需要编写四个反斜杠字符,具体取决于您引用模式的方式 .

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

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

    输出:

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

    转义序列 \~ 在PHP中没有特殊含义's used in a single-quoted string. Three backslashes do also work because the PHP parser doesn'知道转义序列 \~ . 因此 \\ 将成为 \\~ 将保持为 \~ .

    Which one should you use:

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

  • 9

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

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

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

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

相关问题