preg_replace_callback returns 重复值

preg_replace_callback returns duplicate values

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

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 返回数组,否则返回字符串。发生什么事了?

您在 $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