首页 > 解决方案 > Preg_replace 替换中未捕获的捕获组

问题描述

我有以下代码:

$f = 'IMG_1474.PNG';
preg_replace('/(.*)([.][^.]+$)/', '$1' . time() . '$2', $f)

这应该拆分IMG_1474and.PNG并在其间添加纪元。第一个捕获组似乎是空的。

如果preg_match使用,我可以看到第一个捕获组不为空(因此 regex 在 PHP 中的执行与 regex101 相同)。

preg_match('/(.*)([.][^.]+$)/', $f, $match);
print_r($match);

功能演示:https ://3v4l.org/VgDWJ (604147502time()结果)

我的假设是替换位上的连接发生了一些事情。

标签: phpregexpreg-replacecapture-group

解决方案


事实上,问题在于捕获组与time(). 请改用此版本:

$f = 'IMG_1474.PNG';
$output = preg_replace('/(.*)([.][^.]+$)/', '${1}' . time() . '${2}', $f);
echo $output;

这打印:

IMG_14741604148316.PNG
        ^^^^^^^^^^  second since epoch (1970-01-01)

要理解为什么会发生这种情况,我们必须考虑变量替换发生在preg_replace函数调用之前。所以你的串联替换术语:

'$1' . time() . '$2'

实际上首先变成:

'$1' . '1604148623' . '$2'

这是:

'$11604148623' . '$2'

这里的“第一个”捕获组可能被解释为$11(或$116等),并且没有定义。这就是为什么您目前只获得第二个捕获组,但第一个是空的。我建议使用的解决方案${1}保留了捕获组引用,以便在preg_replace通话期间按照您的意愿使用。


推荐阅读