Php DOMDocument::loadHTML错误

Php DOMDocument::loadHTML错误,php,html,domdocument,Php,Html,Domdocument,我构建了一个脚本,将页面上的所有css组合在一起,以便在我的cms中使用它。它很长一段时间都运行良好,现在我发现了这个错误: 警告:DOMDocument::loadHTML() [domdocument.loadhtml]:标记头在实体中无效,第10行在 第26行的css.php警告: DOMDocument::loadHTML()[DOMDocument.loadHTML]:标记导航在中无效 实体,第26行css.php中的第10行 警告:DOMDocument::loadHTML()[DO

我构建了一个脚本,将页面上的所有css组合在一起,以便在我的cms中使用它。它很长一段时间都运行良好,现在我发现了这个错误:


警告:DOMDocument::loadHTML() [domdocument.loadhtml]:标记头在实体中无效,第10行在 第26行的css.php

警告: DOMDocument::loadHTML()[DOMDocument.loadHTML]:标记导航在中无效 实体,第26行css.php中的第10行

警告:DOMDocument::loadHTML()[DOMDocument.loadHTML]:标记 实体中的节无效,css.php中的第22行 26

这是php脚本

这是我的代码:

<?php
header('Content-type: text/css');
include ('../global.php');

if ($usetpl == '1') {
    $client = New client();
    $tplname = $client->template();
    $location = "../templates/$tplname/header.php";
    $page = file_get_contents($location);
} else {
    $page = file_get_contents('../index.php');
}

class StyleSheets extends DOMDocument implements IteratorAggregate
{

    public function __construct ($source)
    {
        parent::__construct();
        $this->loadHTML($source);
    }

    public function getIterator ()
    {
        static $array;
        if (NULL === $array) {
            $xp = new DOMXPath($this);
            $expression = '//head/link[@rel="stylesheet"]/@href';
            $array = array();
            foreach ($xp->query($expression) as $node)
                $array[] = $node->nodeValue;
        }
        return new ArrayIterator($array);
    }
}

foreach (new StyleSheets($page) as $index => $file) {
    $css = file_get_contents($file);
    echo $css;
}

Header、Nav和Section是HTML5中的元素。由于HTML5开发人员觉得很难记住公共和系统标识符,DocType声明只是:

<!DOCTYPE html>
在调用
loadHTML

libxml_use_internal_errors(false);
在它之后


另一种方法是对DOMDocument对象使用。

,您应该能够在load方法之前放置@,以便抑制所有警告

$dom = new DOMDocument;
@$dom->loadHTML($source);

HTML5元素仍然不受支持,但您可以使用
$options
参数完全消除libxml错误

刚定

$doc = new DOMDocument();
$doc->loadHTMLFile("html5.html", LIBXML_NOERROR);
此选项优先于消除PHP错误的
@

但是要小心,libxml非常宽容,它会解析一个损坏的HTML文档如果您对libxml错误保持沉默,您可能甚至没有意识到HTML格式不正确。

大多数人没有意识到HTML和XML作为语言与HTML和XML在解析器方面的区别。解析器接受代码,HTML和XML解析器完全不同。虽然XML解析器在浏览器中会容忍一些次要的事情(例如重复
id
值),但它们不会处理看起来像代码的垃圾

PHP的XML解析器更为严格,不允许重复的
id
值。此外,由于任何东西都可以是元素(例如,
页脚
页眉
),PHP的XML解析器不会抱怨未知的HTML5+元素

$dom->loadXML($xml);

对于任何在客户端开发的人,我强烈建议使用XML解析器来处理HTML5代码,因为我从2000年代到2020年开始开发Gecko浏览器(如Waterbox、Firefox),它拥有最好的XML解析器,因为整个页面都会断开,您会得到一条明确的错误消息。如果您能够理解质量最终会产生数量,那么更严格的代码会产生更好的结果,尽管事实并非如此。

这样做了,现在我得到一个空白page@user1079160这是另一个问题!戈登有个好答案,谢谢@戈丹:如何修复空白页问题?我有同样的空白页问题。我的错误是使用了
print$document->saveXML()
而不是
$document->saveHTML()
。HTML版本不像XML版本那样进行某些格式转换。如果这不是问题所在,请尝试检查输出源,以查看是否存在标记(如果有的话)。它会让你知道引擎盖下发生了什么。另外,不要忘记
var\u dump
!PHP报告了这个问题,在这个问题上,底层libxml2中产生了一个特性请求:这是一个糟糕的解决方案,因为这一行中的错误将成为调试的噩梦@戈登的解决方案要好得多。
$dom->loadXML($xml);