我已经构建了一个自定义CMS。最近,我添加了动态创建页面的功能。我使用CKEditor来获取这些页面的内容。 我还想运行一些可能包含在mysql中存储的页面内容中的php函数。 我不想将实际的PHP代码存储在数据库中,而是将函数名称存储起来。例如,在我可能拥有的数据库中存储的页面中。
<?php //begin output
hello world!
check out this latest news article.
news($type, $id);
//end output
?>
如果在输出中找到EVAL而不使用EVAL,那么查找和执行此现有函数的最佳方法是什么?我正在思考wordpress风格的短代码。也许[[news(latest,71)]?然后有一个函数来查找和执行这些函数,如果它们存在于我的functions.php文件中。不确定最好的方法来解决这个问题。 我没有搜索任何代码答案,而是更多针对此类情景的最佳实践,尤其是针对可能的注射最安全的情况。
答案 0 :(得分:0)
我找到了一个解决方案,从挖掘并找到这个线程 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]]
它始终将文本放在视频下而不是文档中的位置。我需要想办法让短代码按照它的顺序执行。