Thorsten Steffen: Überflüssige Leerzeichen aus HTML-Code entfernen

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

  1. 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

    --
    Nein, ich beantworte keine Fragen per eMail. Dafür ist das Forum da.
    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so!"
    1. 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

      --
      T'Pol: I apologize if I acted inappropriately.
      V'Lar: Not at all. In fact, your bluntness made me reconsider some of my positions. Much as it has now.
      (sh:| fo:} ch:] rl:( br:^ n4:( ie:% mo:) va:| de:/ zu:| fl:( ss:) ls:~ js:|)