web-dev-qa-db-fra.com

PHP Erreurs DOMDocument/avertissements sur les balises html5

J'ai essayé d'analyser le code HTML5 pour pouvoir définir des attributs/valeurs dans le code, mais il semble que DOMDocument (PHP 5.3) ne prend pas en charge les balises telles que <nav> et <section>.

Est-il possible d'analyser cela en HTML dans PHP et de manipuler le code?


Code à reproduire:

<?php
$dom = new DOMDocument();
$dom->loadHTML("<!DOCTYPE HTML>
<html><head><title>test</title></head>
<body>
<nav>
  <ul>
    <li>first
    <li>second
  </ul>
</nav>
<section>
  ...
</section>
</body>
</html>");

Erreur

Avertissement: DOMDocument :: loadHTML (): Tag nav invalide dans Entity, ligne: 4 in /home/wbkrnl/public_html/new-mvc/1.php à la ligne 17

Avertissement: DOMDocument :: loadHTML (): Tag section invalide dans Entity, ligne: 10 in /home/wbkrnl/public_html/new-mvc/1.php à la ligne 17

94
Klaas Sangers

Non, il n'y a aucun moyen de spécifier un type de document particulier à utiliser ou de modifier les exigences du modèle existant.

Votre meilleure solution sera de désactiver le rapport d’erreur avec libxml_use_internal_errors :

$dom = new DOMDocument;
libxml_use_internal_errors(true);
$dom->loadHTML('...');
libxml_clear_errors();
159
lonesomeday

Tu pourrais aussi faire

@$dom->loadHTML($htmlString);
6
Ilker Mutlu

Vous pouvez filtrer les erreurs que vous obtenez de l'analyseur. Comme indiqué dans les autres réponses, désactivez le rapport d'erreur à l'écran, puis parcourez les erreurs et affichez uniquement celles que vous souhaitez:

libxml_use_internal_errors(TRUE);
// Do your load here
$errors = libxml_get_errors();

foreach ($errors as $error)
{
    /* @var $error LibXMLError */
}

Voici une print_r() d'une seule erreur:

LibXMLError Object
(
    [level] => 2
    [code] => 801
    [column] => 17
    [message] => Tag section invalid

    [file] => 
    [line] => 39
)

En comparant la message et/ou la code, celles-ci peuvent être filtrées assez facilement.

6
halfer

Cela a fonctionné pour moi:

$html = file_get_contents($url);

$search = array("<header>", "</header>", "<nav>", "</nav>", "<section>", "</section>");
$replace = array("<div>", "</div>","<div>", "</div>", "<div>", "</div>");
$html = str_replace($search, $replace, $html);

$dom = new DOMDocument();
$dom->loadHTML($html);

Si vous avez besoin de la balise d’en-tête, changez l’en-tête avec une balise div et utilisez un identifiant. Par exemple:

$search = array("<header>", "</header>");
$replace = array("<div id='header1'>", "</div>");

Ce n'est pas la meilleure solution, mais en fonction de la situation, cela peut être utile.

Bonne chance.

0
Emiliano Sangoi

Il ne semble pas y avoir de moyen de supprimer les avertissements mais pas les erreurs. PHP a des constantes qui sont supposées le faire, mais elles ne semblent pas fonctionner. Voici ce qui est DEVRAIT fonctionner, mais pas parce que (bug?) ....

 $doc=new DOMDocument();
 $doc->loadHTML("<tagthatdoesnotexist><h1>Hi</h1></tagthatdoesnotexist>", LIBXML_NOWARNING );
 echo $doc->saveHTML();

http://php.net/manual/en/libxml.constants.php

0
user2782001