Я определяю функцию, которая может обрабатывать короткие коды для сообщений, публикуемых wisiwyg.
Использование функции, основанной на 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>
Что я делаю не так?
действительно, в этом больше смысла
Один из приемов состоит в том, чтобы использовать ob_start() и ob_get_clean(), тогда вы можете выводить эхо из шорткодов, но по-прежнему захватывать вывод в обратном вызове.






Вы должны вернуть значение, а не повторять его. То, что вы видите, правильно, поскольку функция обратного вызова должна оцениваться до того, как результат preg_replace_callback() будет возвращен в вашу переменную.
function slider($tag){
//search $tag in DB
return '<div>...'.$sliderContentFromDB.'...</div>';
}
Возврат гарантирует, что он будет объединен с остальными результатами от preg_replace_callback() и возвращен в правильном порядке. Пример.
Небольшое примечание: добавление \n приведет к созданию хорошо отформатированного отрисованного HTML (исходного кода), вместо того, чтобы хранить все это в одной строке; просто говорю.
@FunkFortyNiner, вы правы, просто делаете это в демонстрационных целях
Да, я знаю Робби :)
Ты? Ха-ха! :-D
О, конечно, я делаю ржу не могу Edit: О, я думал, вы изначально разместили этот первый комментарий @RobbieAverill, ха; моя вина.
Я подумал - рассмешил меня, хотя
Вот как бы я это сделал:
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);
}
Теперь, если вы вернетесь или откроете шорткод, это не имеет значения, потому что в любом случае он будет захвачен буфером.
Вы должны помнить, что контент - это набор шорткодов (думайте о нем как о массиве), поэтому вы не выводите полный контент до тех пор, пока не пройдете через массив, поэтому, когда вы выводите эхо из цикла (из
slider, вызываемого циклом) вывод выходит первым.