DOMDocument :: loadHTML ошибка - PullRequest
       11

DOMDocument :: loadHTML ошибка

47 голосов
/ 05 февраля 2012

Я создаю сценарий, который объединяет все CSS на странице, чтобы использовать его в моей CMS. Долгое время он работал нормально. Я получаю эту ошибку:


Предупреждение : DOMDocument :: loadHTML () [domdocument.loadhtml]: недопустимый заголовок тега в Entity, строка: 10 в css.php on line 26

Предупреждение : DOMDocument :: loadHTML () [domdocument.loadhtml]: неверная навигация по тегам в Сущность, строка: 10 в css.php в строке 26

Предупреждение : DOMDocument :: loadHTML () [domdocument.loadhtml]: Tag раздел недействителен в сущности, строка: 22 в css.php в строке 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;
}

Ответы [ 2 ]

126 голосов
/ 05 февраля 2012

Заголовок, Nav и Section являются элементами из HTML5.Поскольку разработчики HTML5 чувствовали, что слишком сложно запомнить общедоступные и системные идентификаторы, объявление DocType просто:

<!DOCTYPE html>

Другими словами, нет проверяемого DTD, что заставит DOM использовать переходный DTD HTML4.и это не содержит эти элементы, следовательно, Предупреждения.

Чтобы превзойти Предупреждения, поставьте

libxml_use_internal_errors(true);

перед вызовом loadHTML и

libxml_use_internal_errors(false);

послеэто.

Альтернативой будет использование https://github.com/html5lib/html5lib-php.

7 голосов
/ 01 ноября 2018

С объектом DOMDocument вы должны иметь возможность поместить @ перед методом загрузки, чтобы ПОДВЕРГАТЬ все ПРЕДУПРЕЖДЕНИЯ.

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

И продолжай.

...