Überflüssige Leerzeichen aus HTML-Code entfernen
Thorsten Steffen
- programmiertechnik
Hio,
Ich versuche ein PHP-Skript zu schreiben, welches ein HTML-Code etwas "komprimiert"; alle überflüssigen Whitespaces entfernt. Diese sollen aber nur dort entfernt werden, wo sie keine Bedeutung besitzen, also nicht innerhalb von <pre> oder <textarea>.
Folgende Lösung habe ich ausgearbeitet, die soweit auch funktioniert, nur bin ich nicht so recht zufrieden mit dem ganzen.
$ignoreBlocks = array();
$ignoreTrimWhitespaces = array("pre", "textarea");
$countBlocks = count($ignoreTrimWhitespaces);
for ($xx=0; $xx<$countBlocks; $xx++) {
$startTag = preg_quote( "<".$ignoreTrimWhitespaces[$xx] );
$endTag = preg_replace('°\s.+$°', "", $ignoreTrimWhitespaces[$xx]);
$endTag = preg_quote( "</".$endTag.">" );
preg_match_all("°". $startTag .'[^>]*>(.*)'. $endTag. "°Uis", $data, $matches);
for ($yy=0; $yy<count($matches[0]); $yy++) {
$ignoreBlocks[] = $matches[0][$yy];
}
}
$data = preg_replace('°\s\s+°',' ',$data);
$data = preg_replace('°> <°','><',$data);
$countRestoreBlocks = count($ignoreBlocks);
for ($xx=0; $xx<$countRestoreBlocks; $xx++) {
$searchString = $ignoreBlocks[$xx];
$searchString = preg_replace('°\s\s+°',' ',$searchString);
$searchString = preg_replace('°> <°','><',$searchString);
$data = str_replace($searchString, $ignoreBlocks[$xx], $data);
}
Zusammenfassung:
Ich durchsuche den Inhalt von $data (der Inhalt der HTML-Seite) nach Blöcken, in denen nicht die Whitespaces entfernt werden sollen, und speichere diese in eine Liste.
Das Endtag wird mit
$endTag = preg_replace('°\s.+$°', "", $ignoreTrimWhitespaces[$xx]);
$endTag = preg_quote( "</".$endTag.">" );
berechnet, da man z.b. auch per CSS einen normalen Textabsatz zu einem <pre>-Bereich "transformieren" könnte.
Nun werden alle Whitespaces ersetzt und anschliessend die gespeicherten Blöcke wieder mit ihren Whitespaces eingesetzt.
Die Lösung geht zwar, mit kommt das aber wie 3 Schritte vorwärts maschieren um wieder 2 zurückzugehen vor ;). Mit fällt nur keine bessere Lösung gerade ein, vielleicht stehe ich ja nur aufm Schlauch.
Für Tipps&Anregungen bin ich mehr als dankbar.
Das einzige was im im Forums-Archiv dazu finden konnte war http://forum.de.selfhtml.org/archiv/2002/7/17008/#m95539, was auch nicht weiterbrachte.
gruss
Thorsten
Moin Moin !
Mit RegExps alleine kannst Du HTML nicht bearbeiten, jedenfalls nicht so, wie Du es brauchst. Du brauchst einen XML/HTML-Parser, der aus der HTML-Datei einen Parserbaum baut, und danach noch "etwas" Code, der diesen Baum wieder nach HTML zurückschreibt, ohne "überflüssige" Leerzeichen.
Aber was soll das bringen? Das bißchen Leerraum macht den Braten nicht fett. Wenn Du Ladezeiten sparen willst, sieh Dich mit einer Suchmaschine Deiner Wahl mal nach mod_gzip und gzip_cnc um.
Alexander
Hallo Alexander,
Aber was soll das bringen? Das bißchen Leerraum macht den Braten nicht fett.
immerhin ist es eine semantische Komprimierung, die sich mit einer syntaktischen (wie den beiden von Dir genannten) kombineren lassen würde. Man kann sehr wohl das eine tun und das andere nicht lassen.
Ich selbst setze im Büro auch eine Kombination aus beidem ein - nicht zuletzt, weil ich dann die Quelldateien lokal dokumentieren kann (deren Sprache ist nicht nur HTML, sondern auch proprietäres serverseitiges Zeug ... da lohnt es sich, jedes einzelne Tag zu dokumentieren).
Viele Grüße
Michael