首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确地转义反斜杠以匹配单引号和双引号PHP正则表达式中的文字反斜杠

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

Stack Overflow用户
提问于 2013-12-28 19:08:03
回答 2查看 5.7K关注 0票数 6

为了匹配一个字面上的反斜杠,很多人和PHP手册都说:总是三重转义,就像这个\\\\

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

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

代码语言:javascript
复制
$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

结论

  • 如果模式是单引号,则反斜杠必须双转义\\\才能匹配文字\
  • 如果模式是双引号的,则取决于字符类内部是否存在反弹,在字符类之外,至少必须是双转义的\\\,因此必须是三转义的\\\\

谁能给我展示一个不同之处,在一个单引号中的双转义反斜杠(如'~\\\~' )将与双引号模式中的三转义反斜杠相匹配,例如"~\\\\~"或fail。

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

如果这个问题没有答案,我将继续在单引号PHP模式中使用双转义反斜杠\\\来匹配文字\,因为它可能没有什么问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-28 20:37:50

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

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

代码语言:javascript
复制
var_dump('~\\\~');
var_dump("~\\\\~");

输出:

代码语言:javascript
复制
string(4) "~\\~"
string(4) "~\\~"

当转义序列\~用于单引号字符串时,它在PHP中没有特殊意义。三个反斜杠也能工作,因为PHP解析器不知道转义序列\~。因此,\\将成为\,但\~将继续作为\~

您应该使用哪一个:

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

票数 11
EN

Stack Overflow用户

发布于 2013-12-28 20:37:38

在PHP中,斜杠在单引号或双引号字符串中的实际转义没有区别--只要您做的是正确的。您在第一个示例中不习惯工作的原因是,正如注释中指出的那样,它将展开\t为选项卡元字符。

当您只使用三个反斜杠时,单引号字符串中的最后一个将被解释为~,就单引号字符串而言,它将保持原样(因为它不匹配有效的转义序列)。然而,这只是一个巧合,这将被解析,在这种情况下,并没有某种副作用(即,\\‘将不采取相同的行为方式)。

所有转义的原因是正则表达式在某些情况下也需要反斜杠,因为它们也有特殊的意义。这会导致后面出现大量反斜杠,例如\\ (因为它再次增加了另一级别的转义,因此对标记解析器使用八个反斜杠)。

希望这能清除它,因为您似乎对单/双引号字符串中反斜杠的处理感到困惑,而不是正则表达式本身的行为(只要您正确地转义事物,不管是“还是”),反斜杠都是一样的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20818283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档