php - simple - read html as dom
PHP DOMDocument-obtener la fuente html de BODY (4)
Ante el mismo problema, he creado una envoltura alrededor de DOMDocument llamada SmartDOMDocument para superar esta y algunas otras deficiencias (como los problemas de codificación).
Lo puedes encontrar aquí: http://beerpla.net/projects/smartdomdocument
Estoy usando el DOMDocument de PHP para analizar y normalizar el HTML enviado por el usuario usando el método loadHTML
para analizar el contenido y obtener un resultado bien formado a través de saveHTML
:
$dom= new DOMDocument();
$dom->loadHTML(''<div><p>Hello World'');
$well_formed= $dom->saveHTML();
echo($well_formed);
Esto hace un buen trabajo al analizar el fragmento y agregar las etiquetas de cierre apropiadas. El problema es que también obtengo un montón de etiquetas que no quiero, como <!DOCTYPE>
, <html>
, <head>
y <body>
. Entiendo que todo documento HTML bien formado necesita estas etiquetas, pero el fragmento HTML que estoy normalizando se insertará en un documento válido existente.
En su caso, no desea trabajar con un documento HTML, sino con un fragmento HTML, una parte del código HTML; lo que significa que DOMDocument no es exactamente lo que necesita.
En su lugar, prefiero usar algo como HTMLPurifier (cita) :
HTML Purifier es una biblioteca de filtros HTML compatible con los estándares escrita en PHP. HTML Purifier no solo eliminará todo el código malicioso (mejor conocido como XSS) con una lista blanca completamente auditada, segura pero permisiva, sino que también se asegurará de que sus documentos cumplan con los estándares , algo que solo se puede lograr con un conocimiento completo de las especificaciones de W3C.
Y, si intentas tu porción de código:
<div><p>Hello World
Usando la página de demostración de HTMLPurifier , obtienes este HTML limpio como salida:
<div><p>Hello World</p></div>
Mucho mejor, ¿no es así? ;-)
(Tenga en cuenta que HTMLPurfier admite una amplia gama de opciones, y que echar un vistazo a su documentación podría no perjudicarlo)
Esto fue tomado de otro post y funcionó perfectamente para mi uso:
$layout = preg_replace(''~<(?:!DOCTYPE|/?(?:html|head|body))[^>]*>/s*~i'', '''', $layout);
La solución rápida a su problema es usar una expresión xPath para agarrar el cuerpo.
$dom= new DOMDocument();
$dom->loadHTML(''<div><p>Hello World'');
$xpath = new DOMXPath($dom);
$body = $xpath->query(''/html/body'');
echo($dom->saveXml($body->item(0)));
Una advertencia aquí. A veces, loadHTML emitirá una advertencia cuando se encuentre con documentos HTML mal formados. Si está analizando ese tipo de documentos HTML, tendrá que encontrar un mejor analizador html [advertencia de enlace automático].