为了账号安全,请及时绑定邮箱和手机立即绑定

正确的方法来逃避PHP正则表达式中的反斜杠[\]?

/ 猿问

正确的方法来逃避PHP正则表达式中的反斜杠[\]?

catspeake 2019-08-19 17:07:12

正确的方法来逃避PHP正则表达式中的反斜杠[\]?

出于好奇,我试图弄清楚哪种正确的方法来逃避反斜杠用于PHP正则表达式模式,如下所示:

测试01:(3个反斜杠)

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

测试02:(4个反斜杠)

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

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

资源:

查看完整描述

3 回答

?
慕勒3428872

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


例如以下两个正则表达式:


/[a]/

/[aa]/

就正则表达式引擎而言,所有意图都是相同的。字符类获取一个字符列表并将它们“折叠”下来以匹配单个字符,沿着“对于当前正在考虑的字符,是否是在[]?中列出的任何字符”的行。如果你在类中列出两个反斜杠,那么它将是“char是黑色斜杠还是反斜杠?”。


查看完整回答
反对 回复 2019-08-19
?
沧海一幻觉

// 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 '\'后跟一个's'。


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

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

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


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

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

如果在字符类中,则同样适用。


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

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

将字符串括在double而不是单引号中会影响上述结果。


结论:

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


建议:在寻求匹配反斜杠时,

始终使用'\\\\'正则表达式中的四个反斜杠。


逃脱序列


查看完整回答
反对 回复 2019-08-19
?
慕粉4167745

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

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


查看完整回答
反对 回复 2019-08-19

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信