php - Ckeditor/PHP 中的 WordPress 风格简码

标签 php mysql function ckeditor

我构建了一个自定义 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/

相关文章:

PHP/MySQL — 检查用户是普通用户还是管理员

mysql - 标记博客文章时我真的应该使用关系表吗?

c - 我的 int isMember() 上的循环函数

function - 使用调用命令 Powershell 在函数内调用函数

c# - 字符串函数字典 c#,其中函数具有不同的参数

php - 如何仅更新和设置当前时间的所有行

php - Lumen Model::find() 不选择主键

mysql - SQL 过程 - 多值

mysql - 从 SQL 中的串联属性查询日期

php - 从 nginx 中的不同位置提供 php 文件