正确的方法来在PHP正则expression式中转义反斜杠?

出于好奇,我试图找出正确的方法来逃避一个PHP正则expression式模式中使用的反斜杠,如下所示:

testing01:(3个反斜杠)

$pattern = "/^[\\\]{1,}$/"; $string = '\\'; // ----- RETURNS A MATCH ----- 

testing02:(4个反斜杠)

 $pattern = "/^[\\\\]{1,}$/"; $string = '\\'; // ----- ALSO RETURNS A MATCH ----- 

根据以下文章,4被认为是正确的方式,但是让我困惑的是两个testing都返回了一个匹配。 如果两者都对,那么4是首选的方式?

资源:

  • http://www.developwebsites.net/match-backslash-preg_match-php/
  • 不能用正则expression式逃避反斜杠?

问题是,你正在使用一个字符类, [] ,所以它embedded了多less文字反斜杠并不重要,它将被视为一个反斜杠。

例如以下两个正则expression式:

 /[a]/ /[aa]/ 

就所有的意图和目的而言,就正则引擎而言是一样的。 字符类将字符列表“折叠”下来,以匹配单个字符,沿着“当前正在考虑的字符是否是[] ?”中列出的任何字符。 如果你在这个类中列出了两个反斜杠,那么它将会是“字符是黑色还是反斜杠?”。

 // PHP 5.4.1 // Either three or four \ can be used to match a '\'. echo preg_match( '/\\\/', '\\' ); // 1 echo preg_match( '/\\\\/', '\\' ); // 1 // Match two backslashes `\\`. echo preg_match( '/\\\\\\/', '\\\\' ); // Warning: No ending delimiter '/' found echo preg_match( '/\\\\\\\/', '\\\\' ); // 1 echo preg_match( '/\\\\\\\\/', '\\\\' ); // 1 // Match one backslash using a character class. echo preg_match( '/[\\]/', '\\' ); // 0 echo preg_match( '/[\\\]/', '\\' ); // 1 echo preg_match( '/[\\\\]/', '\\' ); // 1 

当使用三个反斜杠匹配一个'\' ,下面的模式被解释为匹配一个'\'后跟一个's'

 echo preg_match( '/\\\\s/', '\\ ' ); // 0 echo preg_match( '/\\\\s/', '\\s' ); // 1 

当使用四个反斜杠匹配'\' ,下面的模式被解释为匹配一个'\'后跟一个空格字符。

 echo preg_match( '/\\\\\s/', '\\ ' ); // 1 echo preg_match( '/\\\\\s/', '\\s' ); // 0 

如果在一个字符类中,这同样适用。

 echo preg_match( '/[\\\\s]/', ' ' ); // 0 echo preg_match( '/[\\\\\s]/', ' ' ); // 1 

上述结果都不会受到双字符而不是单引号括起来的影响。

结论:
无论在括号内的字符类的内部还是外部,除非模式中的下一个字符也被反斜线,否则文字反斜线只能使用三个反斜杠'\\\'匹配,在这种情况下,必须使用四个反斜杠匹配文字反斜线。

build议:
当试图匹配反斜杠时,总是使用四个反斜杠'\\\\'作为正则expression式。

逃逸序列 。

为了避免这种不清楚的代码,你可以使用\ x5c像这样:)

 echo preg_replace( '/\x5c\w+\.php$/i', '<b>${0}</b>', __FILE__ ); 

我已经研究了几年前。 这是因为第一个反斜杠是第二个反斜杠,它们在一起形成了一个“真正的baclkslash”字符,这个真正的字符逃避了第三个字符。 所以它神奇地使3反斜杠工作。

但是,正常的build议是使用4个反斜杠,而不是模糊的3个反斜杠。

如果我错了什么,请随时纠正我。

您也可以使用以下内容

 $regexp = <<<EOR schemaLocation\s*=\s*["'](.*?)["'] EOR; preg_match_all("/".$regexp."/", $xml, $matches); print_r($matches); 

关键字:dochere,nowdoc