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
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();
Tu pourrais aussi faire
@$dom->loadHTML($htmlString);
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.
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.
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();