<?php
ob_start(function($buffer){
$buffer = preg_replace("/{%(data_.*?)%}/", '<?php echo $data[\'slot_$1\']; ?>', $buffer);
$buffer = preg_replace("/{%menu_(.*?)%}/", '<?php echo insertNav($_data[\'slot_$1\']); ?>', $buffer);
return $buffer;
});
?>
尝试使用预览代码用PHP代码替换内容。基本上,对于类似于堆栈溢出的编辑器,如果您键入** strong text **
= 强文本,除非我使用它从数据库中为特定项目提取数据。我正在使用{%data_#%}
来获取#并将其替换为$data['slot_#']
,仅供参考我正在做的事情。
如果我用'Hello'替换<?php echo $data[\'slot_$1\']; ?>
,它会回显Hello。那么为什么不回应php代码?
我用$buffer = preg_replace("/{%(data_.*?)%}/", '$1', $buffer);
替换了它,它回显了data_1。它没有获得#值并将其放入php代码中。回显的代码似乎是$data['slot_data_#]
而不是$data['slot_#']
。输入{%data_#%}
我终于得到了回应的号码。事实证明我在错误的位置有一个(
。这是我的新行:$buffer = preg_replace("/{%data_(.*?)%}/", '<?php echo $data[\'slot_$1\']; ?>', $buffer);
....但是,它仍然留下空白。我知道$ 1现在正在回显正确的数字,但当我把它放入php代码时,没有任何内容在页面上回显。我直接复制并粘贴了这个PHP代码并用$ 1替换了数字,所以这应该是正确的。
答案 0 :(得分:2)
<?php
ob_start(function($buffer){
$buffer = preg_replace("/{%data_(.*?)%}/", '?><?php echo $data["slot_$1"]; ?><?php', $buffer);
$buffer = preg_replace("/{%menu_(.*?)%}/", '?><?php echo insertNav($_data["slot_$1"]);?><?php', $buffer);
return eval($buffer);
});
ob_start
中的PHP代码不会以这种方式执行,你应该使用邪恶的函数:eval()
答案 1 :(得分:0)
在过去的几天里,我发现使用ob_start()返回php代码只能通过eval()完成,并且它有点不安全的代码,因为它让你打开php注入。谢谢@revo
我已经过渡并学习了如何编写模板引擎并使用.tpl文件,这样用户就无法将自己的php代码放入页面中,所有内容都可以使用函数(模板引擎)在后台运行的php页面进行处理)。这使得我不得不使用eval()代码,因为@revo建议我在没有正确验证的情况下不使用它(我不确定我甚至不必担心验证是诚实的)。
我想告诉所有看过这个问题的人我学到了什么,并建议使用模板引擎&amp;功能,避免使用我在我的问题中建议的方法。
感谢@revo与我合作,寻找可能的解决方案,让我了解漏洞。