web-dev-qa-db-fra.com

Erreur DOMDocument :: loadHTML

Je construis un script qui combine tous les CSS sur une page pour l'utiliser dans mes cms. Cela a bien fonctionné pendant longtemps maintenant je reçois cette erreur:


Attention: DOMDocument :: loadHTML () [domdocument.loadhtml]: En-tête de balise non valide dans Entity, ligne: 10 in css.php en ligne 26

Attention: DOMDocument :: loadHTML () [domdocument.loadhtml]: Nav de balise non valide dans Entity, ligne: 10 in css.php en ligne 26

Attention: DOMDocument :: loadHTML () [domdocument.loadhtml]: section de balise non valide dans Entity, ligne: 22 pouces css.php en ligne 26

Ceci est le script php

Voici mon code:

<?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;
}
48
user1079160

Header, Nav et Section sont des éléments de HTML5. Les développeurs HTML5 estimant qu'il est trop difficile de se souvenir des identificateurs publics et système, la déclaration DocType est simplement:

<!DOCTYPE html>

En d'autres termes, il n'y a pas de DTD à vérifier, ce qui obligera DOM à utiliser la DTD transitionnelle HTML4 et qui ne contient pas ces éléments, d'où les avertissements.

Pour supprimer les avertissements, mettez

libxml_use_internal_errors(true);

avant l'appel à loadHTML et

libxml_use_internal_errors(false);

après ça.

Une alternative serait d'utiliser https://github.com/html5lib/html5lib-php .

126
Gordon

Avec un objet DOMDocument, vous devriez pouvoir placer un @ avant la méthode de chargement afin de SUPPRIMER tous les AVERTISSEMENTS.

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

Et continue.

8
dogatonic