preg_match两个带元字符的变量

时间:2010-03-04 20:42:42

标签: regex pcre php posix-ere

我有两个字符串变量,它们都是文件路径。有效的代码使用了不推荐使用的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()

2 个答案:

答案 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));
}