2015-11-25 77 views
6

我想匹配008/的Preg匹配斜杠

preg_match('/008\\//i', '008/', $matches); 
preg_match('/008\//i', '008/', $matches); 

我的问题是,为什么这两个正则表达式的工作。我期望第二个工作,但为什么双反斜杠有效?

+0

你问题中的例子试图匹配正斜杠而不是反斜杠。 – Barmar

+0

为防万一你不知道,作为分隔符的'/'完全是任意的。当我搜索包含斜杠的东西时,我经常会做'preg_match('#008 /#',$ string,$ matches)''这样我就可以避免转义。 – miken32

回答

5

因为PHP中的\\字符串意味着“逃避反斜杠”。由于\/并不意味着任何它不需要逃脱(即使可能),所以他们的评估是一样的。

换句话说,这两个将打印同样的事情:

echo '/008\\//i'; // prints /008\//i 
echo '/008\//i'; // prints /008\//i 

反斜线one of the few characters that can get escaped in a single quoted string(除了明显的\'),这能确保你可以做一个字符串,如'test\\'没有最后逃脱引用。

+0

正斜杠确实需要在由'/'分隔的正则表达式中转义。你是正确的,因为最终的结果是一样的,而且这是传递给PCRE代码的字符串。 – miken32

+0

是的,我的意思是说因为'\'不会评估任何特殊的东西,所以它和''\\ /''具有相同的效果。很显然,这个特定的正则表达式需要转义斜线,并且这两个例子都是这样做的,这就是为什么两者都工作(它们是相同的)。 –