php - Preg_replace 替换中未捕获的捕获组
问题描述
我有以下代码:
$f = 'IMG_1474.PNG';
preg_replace('/(.*)([.][^.]+$)/', '$1' . time() . '$2', $f)
这应该拆分IMG_1474
and.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
通话期间按照您的意愿使用。
推荐阅读
- python - python - 如何使用python将带有功能的图标添加到MDToolBbar?
- c# - 日期时间比较逻辑
- phpmyadmin - 如何在 RDP 上创建数据库?(phpmyadmin)
- ubuntu - 获取 TPM 所有权时出错“TCTI 无效,请参阅 --help”
- swiftui - swiftUI中标签栏的圆角?
- flutter - Flutter/Dart HMAC-SHA1编码,然后请求带有header的web api
- apache-spark - 加速访问数据湖的 UDF
- r - 如何根据其他向量的单调性(增加/减少)对向量的值求和
- sql - sql - sum() 函数没有按我的预期工作
- c# - TextMeshPro 不会通过 PlayerMovement 脚本更改其文本