2009-04-20 74 views
27

Estoy usando la extensión DOM en PHP para compilar algunos documentos HTML, y quiero que la salida tenga un buen formato (con nuevas líneas y sangrías) para que sea legible, sin embargo , a partir de las muchas pruebas que he hecho:PHP HTML "bonita impresión" (no ordenado)

  1. "formatOutput = true" no funciona en absoluto con saveHTML(), solo saveXML()
  2. Incluso si utilicé saveXML(), que todavía sólo funciona en elementos creados a través del DOM, no elementos que se incluyen con loadHTML(), incluso con "preserveWhiteSpace = false"

Si alguien sabe de otra manera, me gustaría saber cómo lo hicieron funcionar.

Tengo un documento DOM y estoy usando saveHTML() para generar el código HTML. Como proviene del DOM, sé ​​que es válido, no es necesario "poner en orden" o validarlo de ninguna manera.

Estoy simplemente buscando una manera de obtener una salida con formato agradable desde la salida que recibo de la extensión DOM.

NB. Como habrás adivinado, no quiero usar la extensión Tidy como a) hace mucho más que yo también la necesito (el marcado ya es válido) yb) realmente hace cambios al contenido HTML (como el tipo de documento HTML 5 y algunos elementos).

Seguimiento:

bien, con la ayuda de la respuesta a continuación he trabajado por qué la extensión DOM no estaba funcionando. Aunque el ejemplo dado funciona, todavía no funcionaba con mi código. Con la ayuda del comentario this encontré que si tiene cualquier nodo de texto donde isWhitespaceInElementContent() es verdadero, no se aplicará ningún formato más allá de ese punto. Esto sucede independientemente de si preserveWhiteSpace es falso o no. La solución es eliminar todos estos nodos (aunque no estoy seguro si esto puede tener efectos adversos sobre el contenido real).

Respuesta

29

tiene razón, parece que no hay sangría para HTML (others are also confused). XML funciona, incluso con código cargado.

<?php 
function tidyHTML($buffer) { 
    // load our document into a DOM object 
    $dom = new DOMDocument(); 
    // we want nice output 
    $dom->preserveWhiteSpace = false; 
    $dom->loadHTML($buffer); 
    $dom->formatOutput = true; 
    return($dom->saveHTML()); 
} 

// start output buffering, using our nice 
// callback function to format the output. 
ob_start("tidyHTML"); 

?> 
<html> 
    <head> 
    <title>foo bar</title><meta name="bar" value="foo"><body><h1>bar foo</h1><p>It's like comparing apples to oranges.</p></body></html> 
<?php 
// this will be called implicitly, but we'll 
// call it manually to illustrate the point. 
ob_end_flush(); 
?> 

resultado:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> 
<html> 
<head> 
<title>foo bar</title> 
<meta name="bar" value="foo"> 
</head> 
<body> 
<h1>bar foo</h1> 
<p>It's like comparing apples to oranges.</p> 
</body> 
</html> 

lo mismo con saveXML() ...

<?xml version="1.0" standalone="yes"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> 
<html> 
    <head> 
    <title>foo bar</title> 
    <meta name="bar" value="foo"/> 
    </head> 
    <body> 
    <h1>bar foo</h1> 
    <p>It's like comparing apples to oranges.</p> 
    </body> 
</html> 

probablemente olvidó preparar PreserveWhitespace = false antes loadHTML?

descargo de responsabilidad: he robado la mayor parte del código de demostración de tyson clugg/php manual comments. flojo yo.


ACTUALIZACIÓN: Ahora recuerdo hace unos años he intentado lo mismo y me encontré con el mismo problema. Lo solucioné aplicando una solución sucia (no era crítico para el rendimiento): de alguna manera me convertí entre SimpleXML y DOM hasta que el problema desapareció. supongo que la conversión eliminó esos nodos.tal vez cargar con dom, importar con simplexml_import_dom, luego dar salida a la cadena, analizar esto con DOM de nuevo y luego impreso bonito. por lo que recuerdo, esto funcionó (pero fue realmente lento).

+0

Gracias. Con tus ejemplos y los comentarios en php.net resolví el problema (ver seguimiento más arriba). –

+0

La solución con DOM me parece bastante pesada. ¿Qué tan rápido o lento es? ¿Vale la pena usarlo también en fragmentos pequeños, o solo en toda la página? – sumid

+0

Existe un problema al usar 'saveXML()' con algunas etiquetas sin valor como '' lo convierte a '