gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 13:41:26 24 4
gpt4 key购买 nike

为了匹配文字反斜杠,很多人和the PHP manual说:总是三次转义它,像这样 \\\\

Note:

Single and double quoted PHP strings have special meaning of backslash. Thus if \ has to be matched with a regular expression \\, then "\\\\" or '\\\\' must be used in PHP code.

这是一个示例字符串:\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 正则表达式模式中使用双转义反斜杠 \\\ 来匹配文字 \ 因为它可能没有任何问题。

最佳答案

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

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

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

输出:

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

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

您应该使用哪一个:

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

关于php - 如何正确转义反斜杠以匹配单引号和双引号 PHP 正则表达式模式中的文字反斜杠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20818283/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com