【问题标题】:Rogue element when parsing HTML with DOMDocument使用 DOMDocument 解析 HTML 时的流氓元素
【发布时间】:2018-07-07 20:31:06
【问题描述】:

假设我的 $html 如下所示:

<!DOCTYPE html>
<html>
<head>
    <script type="text/javascript">document.createElement("video");document.createElement("audio");document.createElement("track");</script>
    <script type="text/javascript" src="/gui/default/tinymcecontent.js"></script>
    <script type="text/javascript" src="/includes/js/video-js/video.min.js"></script>
    <link rel="stylesheet" href="/includes/js/video-js/video-js.css" />
    <script type="text/javascript">document.createElement("video");document.createElement("audio");document.createElement("track");</script>
    <script type"text/javascript" src="/includes/js/video-js/video.js"></script/>
    <link rel="stylesheet" href="/includes/js/video-js/video-js.css" />
</head>
<body style="font-family: arial;font-size: 12px;">
    <p> </p>
    <table width="100%">        
    </table>
</body>
</html>

当我尝试仅解析带有命令的主体标签内的元素时:

$dom = new DOMDocument();

libxml_use_internal_errors(true);
$dom->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'));
libxml_use_internal_errors(false);

$full_dom = $dom->getElementsByTagName('body')->item(0);

结果

$dom->saveHTML($full_dom)

<body>\n<p>\/&gt;<link rel=\"stylesheet\" href=\"\/includes\/js\/video-js\/video-js.css\"><\/p>\n<p>\u00a0<\/p>\n<table width=\"100%\"><\/table>\n<\/body>

元素

<p>\/&gt;<link rel=\"stylesheet\" href=\"\/includes\/js\/video-js\/video-js.css\"><\/p>

从哪里来? 其他一切都很好,只是这个元素从 head 标签转移到 body 标签的元素..

【问题讨论】:

    标签: php html parsing dom


    【解决方案1】:

    它来自这条线:

    <script type"text/javascript" src="/includes/js/video-js/video.js"></script/>
    

    它的格式很糟糕,应该是:

    <script type="text/javascript" src="/includes/js/video-js/video.js"></script>
    

    您必须检查$dom-&gt;loadHTML() 之后的错误以查看发生了什么:

    foreach (libxml_get_errors() as $error) {
        print_r($error);
    }
    

    【讨论】:

    • 天哪,我明白了.. 我有什么选择可以忽略 html 部分中我无法控制也不想拥有任何东西的错误?我只尝试处理 body 标签,忽略其余部分..
    • @SubjectX 我认为你不能。但也许您可以尝试在解析它之前替换 &lt;body&gt; 元素之前的字符串。祝你好运。
    • @SubjectX - 请注意,符合标准的 HTML5 解析器将更好地处理您的格式错误的 HTML - 即与浏览器相同的方式。在stackoverflow.com/questions/10712503/… 的答案中有一些针对此类 php 库的建议
    • 感谢您的建议。我确实在处理一些遗留代码,所以现在实现额外的库并不是最理想的......
    猜你喜欢
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 2012-06-23
    • 2015-02-28
    • 2011-10-11
    • 2013-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多