在PHP中使用变量作为正则表达式模式

3

我有这个正则表达式:

'/^files\/(.+\..+)$/';

我希望用一个运行时变量替换掉 "files/" 部分。

我尝试了如下代码:

$filePath = "files/";
'/^'.$filePath.'(.+\..+)$/';

这没用,还有这个:
$filePath = preg_quote("files/");
'/^'.$filePath.'(.+\..+)$/';

但是在这个循环中,在preg_match一行仍然会出现错误,提示"("是未知的修饰符。

foreach (glob(FILE_PATH."*.*") as $filename) {
    preg_match($pattern, $filename, $matches);
    echo "<option class='file' value='".$matches[1]."'>".$matches[1]."</option>";
}

任何帮助都将不胜感激,谢谢。
编辑
这个有效...
$filePath = 'files\/';

在实际使用中,我需要使用另一个文件中声明的常量。

因此:

define('FILE_PATH', 'files/');

尝试使用该常量时,不能嵌入转义字符,因为应用程序的其他部分需要它而没有转义字符。


$filePath 是否包含斜杠 (/)?这会与您使用的正则表达式定界符冲突。您应该始终对注入表达式的内容进行正则表达式转义。 - arkascha
@arkascha 他这样做是对的(这就是 preg_quote 的作用)。他只是缺少一个参数 ;) - Martin Ender
1个回答

3

你需要将preg_quote函数的定界符作为参数传递:

$filePath = preg_quote("files/", '/');

由于您可以使用许多字符作为分隔符,preg_quote无法知道您将要使用/,因此默认情况下不会对其进行转义。这就是第二个(可选)参数的作用。

否则,您的第二种方法(使用preg_quote)是正确的方法。


太好了!不知道我怎么会错过那个,非常感谢!一旦可以,我会接受这个答案! - ARW

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接