问题描述
$f = 'IMG_1474.PNG';
preg_replace('/(.*)([.][^.]+$)/','$1' . time() . '$2',$f)
应将IMG_1474
和.PNG
分开,并在两者之间添加时期。但是第一个捕获组似乎是空的。
如果使用preg_match
,我可以看到第一个捕获组不为空(因此regex在PHP中的作用与在regex101上相同)。
preg_match('/(.*)([.][^.]+$)/',$f,$match);
print_r($match);
功能演示:https://3v4l.org/VgDWJ(604147502
是time()
的结果)
我的假设是替换位上的级联发生了某些事情。
解决方法
实际上,问题在于捕获组与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
调用期间使用它。