【问题标题】:How to parse HTML with embeded PHP code?如何使用嵌入式 PHP 代码解析 HTML?
【发布时间】:2012-12-12 17:37:40
【问题描述】:

我正在做一些 HTML DOM 操作:

function parse_html($html) {
    $dom->loadHTML($html);
    libxml_clear_errors();

    // Parse DOM 

    return $dom->saveHTML();
}

问题是我的 HTML 包含一些 PHP 代码,其中一些被转换为 HTML 实体。例如,如果$html 包含以下内容:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<?php // lang=es
    $pwd = $parameter['pwd'];
    $url = $parameter['url'];
?>

<p>
    You are now registered. Go to -&gt;
    <a href="<?php echo $url ?>">control panel</a> 
    to change the settings.
</p>

变成了这样:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<head><meta http-equiv="content-type" content="text/html; charset=UTF-8"></head>
<body>
<?php // lang=es
    $pwd = $parameter['pwd'];
    $url = $parameter['url'];
?><p> You are now registered. Go to -&gt; <a href="&lt;?php%20echo%20%24url%20?&gt;">control panel</a> to change the settings.
</p>
</body>
</html>

&lt;?php echo $url ?&gt; 被转换为实体,但我不能使用像 *html_entity_decode* 这样的函数,因为它还会解码一些必须保持实体的实体。

如何解析包含 PHP 代码的 DOM?

【问题讨论】:

  • 您是否可以选择先通过 PHP 预处理器运行 HTML?这将为您提供纯 HTML,然后您可以对其进行解析。
  • 好吧,如果你去彩虹乐园,你可以用你最喜欢的颜色涂上所有的东西,然后重新排列它们而不受物理限制。在编程中,我们通常严格遵守所谓的标准,并且在 DomDocument 中 PHP 是未定义的指示。否则它会发生你所面临的。
  • @user1161318 不,这是项目本身的预解析器
  • @Ivon:如果是这样,请切换到有效的 X(HT)ML,PHP 为processing instructions
  • 也许用解析器可以处理的占位符替换所有 实例,然后再将代码弹出?

标签: php dom


【解决方案1】:

您何时何地以及如何构建$html 变量?正是在那个地点和时间,您想要解析里面的 php。如果你尝试吐出它,它会像一个字符串一样被吐出,不会被解析。

为了更清楚,使用当时包含的 php 构建 $html 变量。或者您可能正在构建模板。在这种情况下,你会采取不同的做法。

如果您在 $html 变量生效后尝试填写 php 内容,您可以改用 str_replace() 或其他类似功能。

【讨论】:

    【解决方案2】:

    我找到的解决方案是创建几个函数来编码/解码 PHP 字符串。

    function encode_php($html) {
        return preg_replace_callback('#<\?php.*\?>#imsU', '_encode_php', $html);
    }
    
    function _encode_php($matches) {
        return 'PHP_ENCRYPTED_CODE_BEGIN'.base64_encode($matches[0]).'PHP_ENCRYPTED_CODE_END';
    }
    
    function decode_php($html) {
        return preg_replace_callback('#PHP_ENCRYPTED_CODE_BEGIN(.*)PHP_ENCRYPTED_CODE_END#imsU', '_decode_php', $html);
    }
    
    function _decode_php($matches) {
        return base64_decode($matches[1]);
    }
    

    选择您确定不会出现在文件中的前缀和后缀非常重要。此解决方案已经过 2500 个 HTML 文件的测试,并且可以正常工作。

    【讨论】:

      猜你喜欢
      • 2014-06-22
      • 1970-01-01
      • 2019-12-28
      • 2020-12-23
      • 2011-04-07
      • 2013-04-27
      • 1970-01-01
      • 2014-12-16
      相关资源
      最近更新 更多