在 HTML 字符串中回显 PHP 代码


Echo PHP Code within an HTML string

我试图通过模板变量显示一堆HTML文本,但它似乎没有处理PHP。我目前在我的视图中使用它(这是代码点火器(

<?php dump($_SESSION); echo (isset($html) && !empty($html)) ? $html : show_404(); ?>

HTML 包括几个带有 php 标签的位置,我希望在页面回显时加载这些位置。有没有办法做到这一点?

我需要它从我传入的 HTML 变量工作的主要原因是因为这是页面创建器的一部分,我需要能够在其中添加并非在每个页面中的 php 条件。

有一种方法可以做到这一点,但它很糟糕:eval()

echo (isset($html) && !empty($html)) ? eval($html) : show_404();

我个人会从文件中ob这个,缓冲它,然后使用get_ob_clean来获得结果,如下所示:

    ob_start();
        include 'temp_file_with_html_in';
        $view = ob_get_contents();
    ob_end_clean();

注意:

  • 你的英语不清楚,所以我不确定你想要什么
  • 这可能无法完全按照您的要求工作

也许更好地解释$html是什么以及它的来源会有所帮助?

我能想到的最快的方法(尽管如果我知道$html是如何创建的,可能会找到更好的解决方案(是将内容放入 tmp 文件中,然后包含它。然而,这实际上是一个警告标志,表明程序存在架构问题(例如,为什么在创建 php 时不能进行 php 插值$html?

$tmpFile = tempnam('/tmp', 'my_app_namespace');
file_put_contents($tmpFile, $html);
include $tmpFile;
unlink($tmpFile); // cleanup

编辑,来自Drupal 7

正如您在评论中暗示的那样,Drupal 7 确实包含我称之为技巧的东西:在您传递给 eval 的代码前面加上一个 PHP 结束标记,然后它会像普通 php 一样处理它包括:

从Drupal 7的./modules/php/php.module,在第79行左右,稍微调整了一下:

ob_start();
print eval('?>' . $html);
$output = ob_get_clean();