【问题标题】:Capture Group Not Captured in Preg_replace ReplacementPreg_replace 替换中未捕获的捕获组
【发布时间】:2021-02-13 16:58:01
【问题描述】:

我有以下代码:

$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/VgDWJ604147502time() 结果)

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

【问题讨论】:

    标签: php regex preg-replace capture-group


    【解决方案1】:

    事实上,问题在于捕获组与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 调用期间可用。

    【讨论】:

    • 哦,我明白了。我在the 604147502 is the time() result 的声明中也是不正确的。其中的第一个整数与我尝试的捕获组配对并丢失,因为$11 不存在。谢谢。
    猜你喜欢
    • 2011-02-24
    • 1970-01-01
    • 2017-04-08
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多