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 或从短代码回显,这没有区别,因为在任何一种情况下,它都会被缓冲区清除。
我正在定义一个函数,它可以为用户在即所得即发的帖子中处理简码。
使用基于 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 或从短代码回显,这没有区别,因为在任何一种情况下,它都会被缓冲区清除。