【问题标题】:preg_replace_callback returns duplicate valuespreg_replace_callback 返回重复值
【发布时间】:2015-07-25 02:19:49
【问题描述】:

我正在尝试理解 preg_replace_callback 函数。在我的回调中,我得到了两次匹配的字符串,而不是只出现在主题字符串中的一次。你可以go here and copy/paste this code 进入测试器,看到它返回了两个值,而我期望的是一个。

preg_replace_callback(
    '"\b(http(s)?://\S+)"', 
    function($match){           
        var_dump($match);
        die();
    },
    'http://a'
);

输出如下:

array(2) { [0]=> string(8) "http://a" [1]=> string(8) "http://a" }

documentation mentions 如果主题是一个数组,则返回一个数组,否则返回一个字符串。发生了什么事?

【问题讨论】:

    标签: php regex preg-replace preg-replace-callback


    【解决方案1】:

    $match[0] 中有完整的模式匹配 \b(http(s)?://\S+),$match[1] 中有带括号的捕获组 (http(s)?://\S+) 的匹配。

    在这种情况下,只需使用 $match[0] 之类的东西:

    $result = preg_replace_callback(
        '"\b(http(s)?://\S+)"', 
        function($match){           
            return $match[0] . '/something.php';
        },
        'http://a'
    );
    

    将http://a 替换为http://a/something.php。

    【讨论】:

    • 为什么s 也没有作为带括号的捕获组返回?
    • 您的主题字符串不是s,而您有一个?,使该组可选。如果您将? 移动到括号内,则该组将始终存在,但为空白或s,具体取决于它是否存在。
    • 哦,我在我自己的代码和这里的示例代码之间交换。我的错。
    猜你喜欢
    • 2011-03-01
    • 2018-03-01
    • 2023-03-06
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 2018-06-25
    • 1970-01-01
    • 2015-02-13
    相关资源
    最近更新 更多