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/VgDWJ(604147502
是 time()
结果)
我的假设是替换位上的串联发生了一些事情。
事实上,问题在于捕获组与 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
调用期间可用,如您所愿。
我有以下代码:
$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/VgDWJ(604147502
是 time()
结果)
我的假设是替换位上的串联发生了一些事情。
事实上,问题在于捕获组与 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
调用期间可用,如您所愿。