PHP 使用 preg_replace_callback 短代码函数 returns 错误的元素顺序

PHP Using preg_replace_callback shortcodes function returns wrong elements order

我正在定义一个函数,它可以为用户在即所得即发的帖子中处理简码。

使用基于 preg_replace_callback 的函数效果很好,但返回的替换值在初始字符串

之前打印

这是处理函数

function shortcodify($string){
    return preg_replace_callback('#\[\[(.*?)\]\]#', function($matches){
        $parts = explode(':',$matches[1]);
        $fnName = array_shift($parts);
        if(function_exists($fnName)){
            return call_user_func_array($fnName,$parts);
        } else {
            return $matches[0];
        }
    },$string);
}

这是将替换简码的函数

function slider($tag){
    //search $tag in DB
    echo '<div>...'.$sliderContentFromDB.'...</div>';
}

用法:

$postContent = "<h1>Super Slider</h1> [[slider:super-slider]] <p>Slider Description</p>";
shortcodify($postContent);

预期结果是:

<h1>Super Slider</h1>
<div>...super slider content...</div>
<p>Slider Description</p>

实际结果是:

<div>...super slider content...</div>
<h1>Super Slider</h1>
<p>Slider Description</p>

我可能做错了什么?

您应该 return 值而不是回显它。您所看到的是正确的,因为回调函数应该在 preg_replace_callback() 结果被 return 编辑到您的变量之前进行评估。

function slider($tag){
    //search $tag in DB
    return '<div>...'.$sliderContentFromDB.'...</div>';
}

返回将确保它以正确的顺序聚合到来自 preg_replace_callback() 和 return 的结果的其余部分。 Example.

我会这样做:

function shortcodify($string){
    return preg_replace_callback('#\[\[(.*?)\]\]#', function($matches){
        //start output buffering
        ob_start();
        $parts = explode(':',$matches[1]);
        $fnName = array_shift($parts);

        //echo values in case they return instead of echo
        if(function_exists($fnName)){
            echo call_user_func_array($fnName,$parts);
        } else {
            echo $matches[0];
        }
        //return contents of buffer
        return ob_get_clean();
    },$string);
}

现在,如果您 return 或从短代码回显,这没有区别,因为在任何一种情况下,它都会被缓冲区清除。