DOMDocument :: loadHTML错误

时间:2012-02-05 12:20:51

标签: php html5 domdocument

我构建了一个脚本,它将页面上的所有css组合在一起,以便在我的cms中使用它。它工作很长时间我现在得到这个错误:

  


警告:DOMDocument :: loadHTML()   [domdocument.loadhtml]:实体中的标题标题无效,行:10英寸   第 26 css.php 警告:   DOMDocument :: loadHTML()[domdocument.loadhtml]:标签导航无效   实体,行: css.php 中的10行 26

  警告: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;
}

4 个答案:

答案 0 :(得分:124)

Header,Nav和Section是HTML5中的元素。因为HTML5开发人员认为记住公共标识符和系统标识符太难了,所以DocType声明只是:

<!DOCTYPE html>

换句话说,没有要检查的DTD,这将使DOM使用HTML4 Transitional DTD并且不包含这些元素,因此警告。

要压制警告,请输入

libxml_use_internal_errors(true);
在致电loadHTML

之前

libxml_use_internal_errors(false);

之后。

另一种方法是使用https://github.com/html5lib/html5lib-php

答案 1 :(得分:6)

使用DOMDocument对象,应该可以在加载方法之前放置@,以禁止所有警告。

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

继续。

答案 2 :(得分:0)

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

只需设置

$doc = new DOMDocument();
$doc->loadHTMLFile("html5.html", LIBXML_NOERROR);

此选项比@优先使用,该选项使PHP错误消失。

但是请注意,libxml非常宽容,它将解析损坏的HTML文档。 如果您忽略libxml错误,您甚至可能都不知道HTML格式错误。

答案 3 :(得分:0)

大多数人不是意识到HTML和XML之间的区别,即语言和HTML和XML在解析器方面的区别。解析器需要代码,而HTML和XML解析器则完全不同。尽管XML解析器在浏览器中可以容忍一些小问题(例如重复的id值),但它们不会与看起来像代码的垃圾一样。

PHP的XML解析器更加严格,并且不允许重复的id值。另外,由于任何元素都可以作为元素(例如footerheadersection),PHP的XML解析器将不会抱怨未知的HTML5 +元素。

$dom->loadXML($xml);

对于在客户端开发的任何人,我强烈建议使用XML解析器来处理您的HTML5代码,并且由于我从2000年代开始开发到2020年,因此Gecko浏览器(例如Waterfox,Firefox)拥有最好的XML解析器,因为整个页面都将中断,您会收到一条 explicit 错误消息。如果您可以理解质量,则更严格的代码会产生更好的结果,尽管事实并非如此。