php字符串与正则表达
今天在工作的时候碰到一个小问题,需要用正则表达式,于是就有了这篇记录,如下:
$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有关。
$str = 'home\/user';
$pattern = addslashes('#home\/user#');
preg_match($pattern, $str, $match);
var_dump($match);
这段代码可以匹配。
$pattern被函数转义的结果其实是#home\\/user#,是可以匹配的,而我们前面定义的正则字符串是#home\\\/user#才能匹配。
- 本文作者:吴泽辉
- 本文链接:https://mutex.top/posts/1b7f1124/
- 发表日期:2017年9月19日
- 版权声明:本文章为原创,采用《知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议》进行许可