正确的方法来在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