我正在尝试为从数据库文本字段运行 php 代码创建一个 bb 代码选项。就像是[?php]code[/?]
我知道它不安全,但是没有人可以编辑页面,我主要想用它来让它计算事物或包含文件。
这就是我到目前为止所拥有的:
$txt = preg_replace("#\[?php\](.+?)\[/?\]#is", eval("\\1"), $txt);
我正在尝试为从数据库文本字段运行 php 代码创建一个 bb 代码选项。就像是[?php]code[/?]
我知道它不安全,但是没有人可以编辑页面,我主要想用它来让它计算事物或包含文件。
这就是我到目前为止所拥有的:
$txt = preg_replace("#\[?php\](.+?)\[/?\]#is", eval("\\1"), $txt);
您可以先开始缓冲,eval
整个字符串,关闭 php 标记,然后将缓冲区作为变量:
$txt = "Result of 2+2 = [?php] echo 4; [/?].";
$txt = str_replace(array('[?php]', '[/?]'), array('<?php','?>'), $txt);
ob_start();
eval('?>'.$txt);
$txt = ob_get_contents();
ob_end_clean();
echo $txt;
您提供的示例不能作为eval()
之前的评估preg_replace()
,结果实际上用作替换。\\1
不是一个有效的 PHP 表达式,所以我希望给定的代码会返回一个解析错误。
您应该preg_match()
先使用提取 PHP 表达式,然后提取eval()
它,然后才将 bb 标记之间的文本替换为eval()
.
也就是说,如上所述,我个人强烈不建议这样做。这基本上提供了对服务器的任意访问,无论如何都是一个非常糟糕的设计理念。我猜你真的只需要一定数量的操作,比如包含来自特定目录的页面。您可以使用所有预防措施专门针对那些数量有限的操作实施专用的 bb 标签。