2011-04-19 1 views
3

Je viens de commencer à utiliser l'objet DOMDocument puisque je veux analyser un fichier HTML téléchargé et l'utiliser ensuite comme modèle pour mes cms.Comment résoudre ce problème d'indentation avec DOMDocument?

Je charge du code HTML à partir d'un fichier et, à des fins de test, je l'enregistre en tant que nouveau fichier HTML sans rien changer. Le problème est: l'indentation est foiré.

Voici ce que mon fichier HTML ressemble à:

<!DOCTYPE html> 
<html> 
    <head> 
     <title>DOM Testpage</title> 
     <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> 
     <meta name="language" content="deutsch, de" /> 
    </head> 
    <body> 
     <div class="pageOverlay"></div> 
     <div style="height:100px;"></div> 
     <div id="LoginForm"> 
      <div id="LoginLogo"> 
       Here's some Text 
       <br /> 
       And another Text with some German Umlauts: öäü ÖÄÜ ß and so on... 
       <br /> 
      </div> 
      <form method="post" action=""> 
       <!-- Here be dragons. And a nice comment --> 
       <input type="text" name="cms_user" value="" class="InputText " data-defaultvalue="Username" title="Please enter your username." style="margin:0px 0px 20px 0px;" /> 
       <input type="password" name="cms_password" value="" class="InputText " data-defaultvalue="Password" title="Please enter your password." style="margin:0px 0px 20px 0px;" /> 
       <input type="checkbox" name="cms_remember_login" value="1" id="cms_remember_login" /> 
       <label for="cms_remember_login" style="line-height:14px; margin-left:5px;">Remember Login</label> 
       <!-- Another comment 
       This one's even 
       longer --> 
       <input type="submit" name="submitLogin" value="Login" /> 
      </form> 
     </div> 
    </body> 
</html> 

La partie PHP:

<?php 
    $lo_dom = new DOMDocument(); 
    $lo_dom->loadHTMLFile("test.html"); 
    $lo_dom->saveHTMLFile("templates/test_neu.html"); 
?> 

Quand j'ouvre le nouveau fichier HTML, la source ressemble à ceci:

<!DOCTYPE html> 
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>DOM Testpage</title><meta name="language" content="deutsch, de"></head><body> 
     <div class="pageOverlay"></div> 
     <div style="height:100px;"></div> 
     <div id="LoginForm"> 
      <div id="LoginLogo"> 
       Here's some Text 
       <br> 
       And another Text with some German Umlauts: &ouml;&auml;&uuml; &Ouml;&Auml;&Uuml; &szlig; and so on... 
       <br></div> 
      <form method="post" action=""> 
       <!-- Here be dragons. And a nice comment --> 
       <input type="text" name="cms_user" value="" class="InputText " data-defaultvalue="Username" title="Please enter your username." style="margin:0px 0px 20px 0px;"><input type="password" name="cms_password" value="" class="InputText " data-defaultvalue="Password" title="Please enter your password." style="margin:0px 0px 20px 0px;"><input type="checkbox" name="cms_remember_login" value="1" id="cms_remember_login"><label for="cms_remember_login" style="line-height:14px; margin-left:5px;">Remember Login</label> 
       <!-- Another comment 
       This one's even 
       longer --> 
       <input type="submit" name="submitLogin" value="Login"></form> 
     </div> 
    </body></html> 

J'ai déjà essayé de régler preserveWhiteSpace et formatOutput mais cela ne change rien.

Ce n'est pas un gros problème du tout, mais ce serait bien si la sortie ressemblait à l'entrée.

Des idées pour résoudre ce problème?

Et une autre question: est-il un moyen d'insérer manuellement un \n linebreak après avoir ajouté un autre nœud avec appendChild()?

Répondre

2

La bonne façon de reformater un document DOM est

$dom = new DOMDocument(); 
$dom->preserveWhiteSpace = FALSE; 
$dom->loadHTMLFile("test.html"); 
$dom->formatOutput = TRUE; 
$dom->saveHTMLFile("templates/test_neu.html"); 

Si ce résultat ne marche pas dans la sortie désirée, vous pouvez toujours ajouter des espaces vous-même. Tout espace utilisé à des fins de formatage est un nœud DOMText. Voir mes réponses

pour une explication plus détaillée. Une alternative à cela serait d'utiliser Tidy pour reformater le code ou l'un des outils proposés dans https://stackoverflow.com/search?q=html+beautifier+php

+0

Merci pour votre réponse. J'ai déjà essayé ces deux options mais la mise en forme reste la même. Je vais jeter un oeil à vos liens fournit. Merci beaucoup. – fabsn

0

Came à travers cette question tout en cherchant une solution pour indenter la sortie XSLTProcessor. Voici une autre approche disgracieuse qui pourrait sauver quelqu'un quelque temps:

$xml -> preserveWhiteSpace = false; 
$xml -> formatOutput = true; 

$html = $xml -> saveXML(); 
$html = strstr($html, '<html'); 

file_put_contents('output.html', $html); 

Toute autre configuration ne fonctionne pas, pour moi en tout cas.

Questions connexes