2009-04-20 14 views
27

Sto usando l'estensione DOM in PHP per creare alcuni documenti HTML e voglio che l'output sia formattato correttamente (con nuove linee e rientri) in modo che sia leggibile, tuttavia , dai numerosi test che ho fatto:PHP "pretty print" HTML (non Tidy)

  1. "formatOutput = true" non funziona affatto con saveHTML(), solo saveXML()
  2. Anche se ho usato saveXML(), è ancora solo funziona sugli elementi creati tramite il DOM, non sugli elementi inclusi con loadHTML(), anche con "preserveWhiteSpace = false"

Se qualcuno lo sa diversamente, mi piacerebbe davvero sapere come l'hanno fatto funzionare.

Quindi, ho un documento DOM e sto usando saveHTML() per emettere l'HTML. Dal momento che proviene dal DOM, so che è valido, non è necessario "Tidy" o convalidarlo in alcun modo.

Sto semplicemente cercando un modo per ottenere un output ben formattato dall'output ricevuto dall'estensione DOM.

NB. Come avrai intuito, non voglio usare l'estensione Tidy come a) lo fa molto di più che ne ho bisogno anche io (il markup è già valido) eb) in realtà apporta modifiche al contenuto HTML (come il doctype HTML 5 e alcuni elementi).

Follow Up:

OK, con l'aiuto della risposta qui sotto ho lavorato perché l'estensione DOM non funzionava. Sebbene l'esempio dato funzioni, non funzionava ancora con il mio codice. Con l'aiuto del commento this ho scoperto che se si hanno nodi di testo in cui isWhitespaceInElementContent() è true, non verrà applicata alcuna formattazione oltre quel punto. Ciò accade indipendentemente dal fatto che preserveWhiteSpace sia o meno falso. La soluzione è rimuovere tutti questi nodi (anche se non sono sicuro che ciò possa avere effetti negativi sul contenuto effettivo).

risposta

29

hai ragione, non sembra esserci alcun rientro per HTML (others are also confused). XML funziona, anche con il codice caricato.

<?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(); 
?> 

risultato:

<!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 stesso 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> 

probabilmente dimenticato di impostare PreserveWhitespace = false prima loadHTML?

disclaimer: ho rubato la maggior parte del codice demo da tyson clugg/php manual comments. pigro me.


UPDATE: Ora ricordo qualche anno fa ho provato la stessa cosa e incontrato lo stesso problema. Ho risolto questo problema applicando una soluzione sporca (non era critico per le prestazioni): ho solo in qualche modo convertito tra SimpleXML e DOM fino a quando il problema non fosse scomparso. Suppongo che la conversione si sia sbarazzata di quei nodi.forse caricare con dom, importare con simplexml_import_dom, quindi stampare la stringa, analizzare questo con DOM di nuovo e quindi stamparlo piuttosto. per quanto mi ricordo ha funzionato (ma era in realtà lento).

+0

Grazie. Con i tuoi esempi e i commenti su php.net ho risolto il problema (vedi il seguito sopra). –

+0

La soluzione con DOM mi sembra abbastanza pesante. Quanto è veloce o lento? Vale la pena utilizzarlo anche su piccoli frammenti o solo sull'intera pagina? – sumid

+0

Si è verificato un problema durante l'utilizzo di 'saveXML()' con alcuni tag senza valore come '' lo converte in '