在 PHP 正则表达式中转义反斜杠 [ \ ] 的正确方法?

2022-08-30 12:25:46

只是出于好奇,我试图找出哪种方法可以正确转义反斜杠以用于PHP正则表达式模式,如下所示:

测试 01:(3 个反斜杠)

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

// ----- RETURNS A MATCH -----

测试 02:(4 个反斜杠)

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

// ----- ALSO RETURNS A MATCH -----

根据下面的文章,4应该是正确的方法,但让我感到困惑的是,两个测试都返回了匹配项。如果两者都是正确的,那么4是首选方式吗?

资源:


答案 1
// 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

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

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

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

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

如果在字符类中也是如此。

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

上述结果都不会因将字符串括在双引号而不是单引号中而受到影响。

结论:
无论是在括号字符类内部还是外部,文本反斜杠都可以仅使用三个反斜杠进行匹配,除非模式中的下一个字符也进行了反斜杠,在这种情况下,必须使用四个反斜杠匹配文字反斜杠。'\\\'

建议:
在搜索匹配反斜杠时,始终在正则表达式模式中使用四个反斜杠。'\\\\'

转义序列


答案 2

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

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

推荐