Preg_replace 替换中未捕获捕获组

Capture Group Not Captured in Preg_replace Replacement

我有以下代码:

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

应该拆分 IMG_1474.PNG 并在两者之间添加纪元。不过第一个捕获组似乎是空的。

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

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

功能演示:https://3v4l.org/VgDWJ604147502time() 结果)

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

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

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

这会打印:

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

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

'' . time() . ''

其实先变成:

'' . '1604148623' . ''

即:

'604148623' . ''

这里的“第一个”捕获组可能被解释为</code>(或<code>6等),并没有定义。这就是为什么你目前只得到第二个捕获组,而第一个是空的。我建议的解决方案使用 </code> 保留捕获组引用,因此它在 <code>preg_replace 调用期间可用,如您所愿。