允许用户为功能制作模板扫描代码

时间:2014-02-03 15:28:11

标签: php function templates filter

我目前正在创建一个网络应用,我想允许我的用户创建一个模板。我只允许他们使用HTML和一些函数来获取一些值,所以我有一些函数 getDescription();但是因为它的PHP我还有其他功能(例如phpinfo();),我不希望它们使用。

是否可以设置过滤器(如in_array)来检查是否使用了声明以外的函数? 或者是否有一个模板引擎或其他类似的东西。

我对模板很陌生,我找不到任何东西。

3 个答案:

答案 0 :(得分:2)

如果他们只是创建HTML模板,您可以允许他们放置例如;

<div>
[PHP]getDescriptions()[PHP]
</div>

<div>
[PHP]phpinfo()[/PHP]
</div>

然后在他们保存的解析文件中或其他任何内容时,您可以

$allowedFunctions = array('getDescriptions');

$input = '';//html from the template
foreach($allowedFunctions as $key => $value){
    $myVal = $value();
    $input = str_replace('[PHP]'.$value.'()[/PHP]',$myVal,$input);
}

这将用getDescriptions()返回的内容替换[PHP] getDescriptions()[/ PHP] ...

和phpinfo()不会改变。

答案 1 :(得分:1)

您可以检查function_exists是否存在某个功能。如果您希望它们使用您为此目的定义的函数,那么您可以使用类似'tpl_ *'的函数为这些函数添加前缀。如下所示:

function tpl_getDescription() {/*code here*/}

然后当你的用户试图实现像getDescription这样的函数时,你可以添加“tpl_”并检查function_exists()是否存在该函数。

if(function_exists('tpl_' . $userFuncName))
{
    call_user_func('tpl_' . $userFuncName)
}

即使用户试图唤起本机php函数,tpl_也会以前缀为准,如果返回false则为。

答案 2 :(得分:1)

是的,您可以轻松创建一个枚举外部文件中所有用户功能的脚本。假设你有这个“模板”,template.php

<?
function getDescription() {
}
function userFunc() {
}
function anotherFunction() {
}
?>

然后您可以通过这种方式获得template.php中所有函数的列表:

<?
include('template.php');
$functions = get_defined_functions();
echo '<pre>';
print_r($functions['user']);
echo '</pre>';
?>

会输出:

Array
(
    [0] => getdescription
    [1] => userfunc
    [2] => anotherfunction
)

我会通过AJAX调用此脚本,例如getfunctions.php?file=template.php,它返回了一个包含template.php内所有用户函数的JSON。