Я создал собственную CMS. Недавно я добавил возможность динамически создавать страницы. Я использовал CKEditor для содержания этих страниц.
Я также хотел бы запустить некоторые функции PHP, которые могут быть включены в содержимое страницы, хранящейся в MySQL.
Я не хочу хранить реальный код PHP в базе данных, а скорее имена функций. Например, на странице, хранящейся в базе данных, я могу иметь.
<?php //begin output
hello world!
check out this latest news article.
news($type, $id);
//end output
?>
Каков наилучший способ найти и выполнить эту существующую функцию, не используя EVAL, если она найдена в выходных данных? Я думал в духе коротких кодов в стиле WordPress. Может быть, [[news (latest, 71]]]? Тогда есть функция для поиска и выполнения этих функций, если они существуют в моем файле functions.php. Не совсем уверен, что лучший способ это сделать.
Я не ищу ни одного кода ответов, но больше рекомендую подобный сценарий, особенно наиболее безопасный от возможных инъекций.
Я нашел решение покопаться и найти эту тему
Как создать функцию WordPress в стиле шорткода в PHP
Я могу передать такие короткие коды в CKEditor
[[utube 1 video_id]]
Затем на моей странице, которая отображает код:
print shortcodify($page_content);
используя эту функцию:
function shortcodify($string){
return preg_replace_callback('#\[\[(.*?)\]\]#', function ($matches) {
$whitespace_explode = explode(" ", $matches[1]);
$fnName = array_shift($whitespace_explode);
return function_exists($fnName) ? call_user_func_array($fnName,$whitespace_explode) : $matches[0];
}, $string);
}
Если имя функции существует (utube), она запустит функцию.
Единственная проблема, с которой я столкнулся на данный момент, не имеет значения, где я размещаю [[shortcode]] в моем редакторе, он всегда выполняется первым.
Например, в CKEditor я положил:
Hello world! Check out my latest video
[[utube 1 video_id]]
Он всегда будет помещать текст под видео вместо того, где он находится в документе. Мне нужно изобразить способ выполнения короткого кода в порядке его размещения.
Других решений пока нет …