【问题标题】:Using capture groups in preg_replace()在 preg_replace() 中使用捕获组
【发布时间】:2019-06-22 05:08:06
【问题描述】:

我很难理解 preg_replace()。
这就是我到目前为止所得到的。 preg_replace($patter, $replacement, $string)
但是,当有替换的捕获组时,它让我感到困惑。 但我还是得到了一些。如下所示

preg_replace('/(\w+)/', 'hello', 'say hello!')
我知道它会导致“你好你好!”。 我可以通过捕获组做更多的事情。 preg_replace('/(\w+)/','\1 Hello', 'Say World!',1)

这将导致“Say Hello World”。

这是我不明白的。

<?php
$string = 'April 15, 2003';
$pattern = '/(\w+) (\d+), (\d+)/i';
$replacement = '${1}1,$3';
echo preg_replace($pattern, $replacement, $string);
?>
Output:
April1,2003

${1}1,$3 是什么意思?

使用$1\1&lt;\1&gt;有什么区别 这个${1}1 是什么意思?

【问题讨论】:

    标签: php regex pcre


    【解决方案1】:

    好问题!

    替换零件

    我的猜测是 \1> 和 $1 ${1} 几乎相同,用于处理捕获组,除了其中一个有一个额外的&lt;&gt;

    我认为我们正在使用${1}1,因为如果我们不使用,我们将拥有$11,它并不存在,因为我们没有那 11 个捕获组,我们只有其中的 3 个, \11 的类似故事。

    ${1}1,$3 表示第一个捕获组${1},编号为1,第三个捕获组$3

    正则表达式内部

    当我们使用\1\2 在正则表达式中,而不是作为 替代,它将引用先前的捕获组$1$2,这与替代部分中的\12 相同,我也认为这可能会创建合理的和有效的混淆。

    Please see this demo for back-referencing.

    参考

    Named Capturing Groups and Backreferences

    【讨论】:

    • 所以,$1\1 是相同的。我们正在捕获第一个匹配组?我很困惑(?&lt;name&gt;) 这是一个命名组。你能给我任何链接来消除我对捕获组和命名捕获组的疑虑吗?你的回答很有帮助。
    • 非常感谢您的回答和支持,非常感谢。
    猜你喜欢
    • 2021-02-13
    • 1970-01-01
    • 2016-07-18
    • 2016-05-23
    • 1970-01-01
    • 2014-03-11
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    相关资源
    最近更新 更多