题
我有一个包含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);
?>
只要确保从数据库中检索到的内容已经首先正确清理,因为您实际上允许任何可以将内容导入数据库的人执行代码。
不隶属于 StackOverflow