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;
}
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 .
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.