我构建了一个自定义 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 文件中)。不太确定解决此问题的最佳方法。 我并不是在寻找任何代码答案,而是寻找针对此类场景的最佳实践,尤其是针对可能的注入(inject)最安全的实践。
最佳答案
我通过挖掘并找到这个线程找到了解决方案 How to create a Wordpress shortcode-style function in 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]]
它总是将文本放在视频下方,而不是文档中的位置。我需要找到一种方法让短代码按照放置的顺序执行。
关于php - Ckeditor/PHP 中的 WordPress 风格简码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28487256/