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