2010-02-27 34 views
16

estoy usando DOMDocument de PHP para analizar y normalizar HTML enviado por el usuario usando el método loadHTML para analizar el contenido a continuación, obtener un resultado bien formado a través de saveHTML:PHP DOMDocument - obtener código fuente HTML de CUERPO

$dom= new DOMDocument(); 
$dom->loadHTML('<div><p>Hello World'); 
$well_formed= $dom->saveHTML(); 
echo($well_formed); 

Hace un trabajo excelente al analizar el fragmento y agregar las etiquetas de cierre correspondientes. El problema es que también estoy recibiendo un montón de etiquetas que no quiero, como <!DOCTYPE>, <html>, <head> y <body>. Entiendo que cada documento HTML bien formado necesita estas etiquetas, pero el fragmento HTML que estoy normalizando se va a insertar en un documento válido existente.

Respuesta

3

En su caso, no desea trabajar con un documento HTML, pero con un fragmento de HTML, una parte del código HTML ;; lo que significa que DOMDocument no es exactamente lo que necesitas.

En cambio, preferiría usar algo como HTMLPurifier(citando):

Purificador HTML es una librería de filtros HTML compatible con los estándares escrito en PHP. Purificador HTML no sólo eliminará toda código malicioso (más conocida como XSS) con un fondo auditado, asegurar aún lista blanca permisiva, sino que también asegurarse de que sus documentos son compatible con las normas, algo que sólo alcanzable con una amplia conocimiento de las especificaciones del W3C.

Y, si se intenta su porción de código:

<div><p>Hello World 

Usando the demo page of HTMLPurifier, se obtiene este código HTML limpio como una salida:

<div><p>Hello World</p></div> 

Mucho mejor, ¿verdad? ;-)

(Tenga en cuenta que HTMLPurfier Suppots una amplia gama de opciones, y que echar un vistazo a su documentación podría no herir a)

+5

Hay buena información aquí, pero me gustaría argumento de que DOMDocument sigue siendo una de fiar herramienta para esto. La existencia de un método "loadHTML" implica que DOMDocument está destinado a analizar documentos HTML y XML. HTMLPurifier u otros analizadores de HTML "verdaderos" escritos en PHP son geniales, pero su perf. siempre va a palidecer en comparación con los objetos PHP integrados. –

+0

@ Alan: Estoy de acuerdo en que DOMDocument es excelente a la hora de analizar documentos HTML ;;; pero para las porciones de HTML, especialmente ** enviado por el usuario **, creo que HTMLPurifier es una herramienta mejor: se ha creado exactamente con el objetivo de filtrar el HTML enviado por el usuario, incluso desde un punto de vista de seguridad * (Por ejemplo, DOMDocument no le importa XSS, mientras que HTMLPurifier lo hace ;;; DOMDocument no le permite especificar qué etiquetas/atributos deben permitirse, mientras que HTMLPUrifier lo hace) * –

22

La solución rápida a su problema es el uso de 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 palabra de advertencia aquí. A veces loadHTML emitirá una advertencia cuando se encuentre con documentos HTML mal formados. Si está analizando ese tipo de documentos HTML, necesitará encontrar un better html parser [advertencia de autoenlace].

+3

esto devolverá [CONTENIDO] ... ¿cómo puede obtener solo [CONTENIDO]? – farinspace

+1

siempre puede hacer una búsqueda y reemplazar antes de la salida ... – farinspace

1

Enfrentado con el mismo problema, he creado un contenedor alrededor de DOMDocument llamado SmartDOMDocument para superar esta y otras deficiencias (como problemas de codificación).

Se puede encontrar aquí: http://beerpla.net/projects/smartdomdocument

0

Esto fue tomado de otro post y funcionó a la perfección para mi uso:

$layout = preg_replace('~<(?:!DOCTYPE|/?(?:html|head|body))[^>]*>\s*~i', '', $layout); 
+0

relevante: http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags –

Cuestiones relacionadas