0

我有一个包含 HTML 和 PHP 的字符串,当我从数据库中提取字符串时,它会回显到屏幕,但 PHP 代码不显示。字符串如下所示:

   $string = 'Hello <?php echo 'World';?>';
   echo $string;

输出

   Hello

源代码

   Hello <?php echo 'World';?>

当我查看源代码时,我可以在那里看到 php 行。所以我需要做的是 eval() 只是字符串中的 php 段。

要考虑的一件事是,PHP 可以在任何给定时间位于字符串中的任何位置。

* 澄清一下,我的 PHP 配置是正确的,这是一些 PHP 从数据库中转储而不渲染的情况,因为我正在回显一个带有 PHP 代码的变量,它无法运行。*

再次感谢我可能收到的任何帮助。

4

3 回答 3

4
$str = "Hello
<?php echo 'World';?>";

$matches = array();

preg_match('/<\?php (.+) \?>/x', $str, $matches);

eval($matches[1]);

这会奏效,但就像其他人已经并且将建议的那样,这是一个糟糕的主意。您的应用程序架构不应该围绕在数据库中存储代码展开。

最简单的是,如果您的页面总是需要显示字符串,请将这些字符串存储在数据库中,而不是生成它们的代码。现实世界的数据比这更复杂,但必须始终在数据库中正确建模。

编辑:需要调整 preg_replace_callback 以正确删除源/插值。

于 2009-06-21T22:54:00.460 回答
0

您不应该评估 php 代码,只需运行它。需要安装 php 解释器,并正确配置 apache+php。然后这个 .php 文件应该输出 Hello World。

对编辑的回答: 使用 preg_replace_callback 获取 php 部分,对其进行评估,将输入替换为输出,然后回显它。但。如果你应该评估来自数据库的东西,我几乎可以肯定,这是一个设计错误。

于 2009-06-21T22:39:42.953 回答
0

eval() 应该可以正常工作,只要代码是正确的 PHP 并以分号结尾。你先去掉 php 标签,然后评估它怎么样。

以下示例已经过测试并且有效:

<?php
$db_result = "<?php echo 'World';?>";
$stripped_code = str_replace('?>', '', str_replace('<?php', '', $db_result));
eval($stripped_code);
?>

只要确保您从数据库中检索到的任何内容都已被正确清理,因为您实际上允许任何可以将内容放入数据库的人执行代码。

于 2009-06-21T22:57:15.227 回答