php字符串与正则表达

今天在工作的时候碰到一个小问题,需要用正则表达式,于是就有了这篇记录,如下:

1
2
3
4
$str = 'home\/user';
$pattern = '#home\\/user#';
preg_match($pattern, $str, $match);
var_dump($match);

这段代码是匹配不到的, 因为$pattern被正则表达式引擎解析之后是‘#home/user#’(注:这块并不会被php的单引号解析),所以不能匹配到$str。

将$pattern改写为’#home\\\\/user#’即可。

上面的正则表达式首先被php解析为‘#home\\\/user#’字符串,这样被正则表达式引擎使用的时候会将第一个反斜线视为转义符号,解析之后变成’#home\/user#’,也就匹配到了字符串。

还有一点需要注意,在php的单引号字符串中只会解析\\’和\\,除此之外所有的转义符号都不会被解析,但是双引号除了解析这两个之外还会解析诸如\n之类的特殊符号。所以针对上面的问题,用单引号或者双引号结果是一样的。

2017.12.9 更新

今天意外发现个有意思的事情,也是跟上面的demo有关。

1
2
3
4
$str = 'home\/user';
$pattern = addslashes('#home\/user#');
preg_match($pattern, $str, $match);
var_dump($match);

这段代码可以匹配。

$pattern被函数转义的结果其实是#home\\/user#,是可以匹配的,而我们前面定义的正则字符串是#home\\\/user#才能匹配。