loadhtmlfile - Errores/advertencias PHP DOMDocument en etiquetas html5
php domdocument loadhtmlfile (6)
He intentado analizar el código HTML5 para poder establecer atributos / valores dentro del código, pero parece que DOMDocument (PHP5.3) no admite etiquetas como <nav>
y <section>
.
¿Hay alguna manera de analizar esto como HTML en PHP y manipular el código?
Código para reproducir:
<?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>");
Error
Advertencia: DOMDocument :: loadHTML (): Tag nav invalid en Entity, línea: 4 en /home/wbkrnl/public_html/new-mvc/1.php en la línea 17
Advertencia: DOMDocument :: loadHTML (): la sección de etiquetas no es válida en Entity, línea: 10 en /home/wbkrnl/public_html/new-mvc/1.php en la línea 17
Esto funcionó para mí:
$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 necesita la etiqueta del encabezado, cambie el encabezado con una etiqueta div y use una identificación. Por ejemplo:
$search = array("<header>", "</header>");
$replace = array("<div id=''header1''>", "</div>");
No es la mejor solución, pero dependiendo de la situación puede ser útil.
Buena suerte.
Las etiquetas HTML5 casi siempre usan atributos como id, clase, etc. Entonces el código para reemplazar será:
$html = file_get_contents($url);
$search = array(
"<header", "</header>",
"<nav", "</nav>",
"<section", "</section>",
"<article", "</article>",
"<footer", "</footer>",
"<aside", "</aside>",
"<noindex", "</noindex>",
);
$replace = array(
"<div", "</div>",
"<div", "</div>",
"<div", "</div>",
"<div", "</div>",
"<div", "</div>",
"<div", "</div>",
"<div", "</div>",
);
$html = str_replace($search, $replace, $html);
$dom = new DOMDocument();
$dom->loadHTML($html);
No parece haber una manera de eliminar las advertencias, pero no los errores. PHP tiene constantes que se supone que deben hacer esto, pero parece que no funcionan. Esto es lo que DEBERÍA funcionar, pero no porque (¿error?) ...
$doc=new DOMDocument();
$doc->loadHTML("<tagthatdoesnotexist><h1>Hi</h1></tagthatdoesnotexist>", LIBXML_NOWARNING );
echo $doc->saveHTML();
No, no hay forma de especificar un tipo de documento particular para usar, o modificar los requisitos del existente.
Su mejor solución viable será desactivar el informe de errores con libxml_use_internal_errors
:
$dom = new DOMDocument;
libxml_use_internal_errors(true);
$dom->loadHTML(''...'');
libxml_clear_errors();
Puede filtrar los errores que obtiene del analizador. Según otras respuestas aquí, apague los informes de errores en la pantalla, y luego repita los errores y solo muestre los que desea:
libxml_use_internal_errors(TRUE);
// Do your load here
$errors = libxml_get_errors();
foreach ($errors as $error)
{
/* @var $error LibXMLError */
}
Aquí hay un print_r()
de un solo error:
LibXMLError Object
(
[level] => 2
[code] => 801
[column] => 17
[message] => Tag section invalid
[file] =>
[line] => 39
)
Al hacer coincidir el message
y / o el code
, estos pueden filtrarse con bastante facilidad.
También podrías hacer
@$dom->loadHTML($htmlString);