1

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

4

2 回答 2

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 模式部分:PCRE 非常强大,但这种能力伴随着一些技巧......

于 2010-03-04T20:46:26.743 回答
0

您可以在没有正则表达式的情况下解决这个问题:

$pos = strpos($path2, $path);
if ($pos !== false) {
    $match = substr($path2, $pos+strlen($path));
}
于 2010-03-04T20:51:09.887 回答