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

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

<强>输出

   Hello

源代码

   Hello <?php echo 'World';?>

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

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

*只是为了澄清,我的PHP配置是正确的,这是一些PHP从数据库中转储而不是渲染的情况,因为我在回显一个带有PHP代码的变量,它失败了跑步。 *

再次感谢您提供的任何帮助。

有帮助吗?

解决方案

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

$matches = array();

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

eval($matches[1]);

这将有效,但像其他人一样并且会建议,这是一个可怕的想法。您的应用程序体系结构永远不应该围绕在数据库中存储代码。

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

编辑:需要使用preg_replace_callback进行调整才能正确删除源/插值。

其他提示

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

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

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top