【发布时间】:2019-06-06 15:15:51
【问题描述】:
我正在定义一个函数,它可以为用户所见即所得的帖子处理短代码。
使用基于 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>
我做错了什么?
【问题讨论】:
-
你必须记住内容是一个短代码的集合(把它想象成一个数组)所以在你遍历数组之前你不会输出完整的内容,所以当你从循环中回显时(来自循环调用的
slider)输出首先出来。 -
确实更有意义
-
一个技巧是使用
ob_start()和ob_get_clean()然后你可以从短代码中回显,但仍然在回调中捕获输出
标签: php regex function callback preg-replace