ob_start()不替换内容

时间:2014-01-04 06:57:50

标签: php

<?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_#%}

时,只能输入数字

编辑2

我终于得到了回应的号码。事实证明我在错误的位置有一个(。这是我的新行:$buffer = preg_replace("/{%data_(.*?)%}/", '<?php echo $data[\'slot_$1\']; ?>', $buffer); ....但是,它仍然留下空白。我知道$ 1现在正在回显正确的数字,但当我把它放入php代码时,没有任何内容在页面上回显。我直接复制并粘贴了这个PHP代码并用$ 1替换了数字,所以这应该是正确的。

2 个答案:

答案 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与我合作,寻找可能的解决方案,让我了解漏洞。