我有两个字符串变量,它们都是文件路径。有效的代码使用了不推荐使用的ereg,因此我尝试使用preg_match重写它:
有效的旧代码:
$path1 = quotemeta($path);
ereg("$path1(.*)$", $path2, $matches);
使用似乎不起作用的preg_match:
$path1 = quotemeta($path);
preg_match("/$path1(.*)$/", $path2, $matches);
它给出了
preg_match():未知修饰符'V'错误。
另外,我想要获得的主要内容是$ matches [1],这是与第一个捕获的带括号的子模式匹配的文本,所以我认为我不能真正使用substr()
。
答案 0 :(得分:1)
如果您的$path
变量中有一些特殊字符,则应对其进行转义 - 并且考虑到您使用PCRE,它们应该被转义;而不是POSIX-regex。
这可以使用preg_quote
函数完成;这意味着您的代码将如下所示:
$path1 = preg_quote($path, '/');
preg_match("/$path1(.*)$/", $path2, $matches);
请注意,PCRE在正则表达式周围使用分隔符 - 在这里,您使用了/
;此分隔符必须传递给preg_quote
,因为默认情况下此函数不会转义/
字符。
您使用的quotemeta
函数未引用PCRE使用的所有字符。
当你将一些代码从POSIX-regex移植到PCRE时,你应该看一下PCRE Patterns section of the manual:PCRE是非常强大的,但是这个功能带来了几个技巧......
答案 1 :(得分:0)
你可以在没有正则表达式的情况下解决这个问题:
$pos = strpos($path2, $path);
if ($pos !== false) {
$match = substr($path2, $pos+strlen($path));
}