HTML-Komprimierung

ComFreek

Mod | @comfreek
Moderator
Guten Abend!

ich bin gerade dabei eine Website bzw. ein CMS zu optimieren, indem ich u.a. den Quelltext komprimiere.
Nun will ich alle Leerräume im HTML-Code entfernen, sodass als Endergebnis nur eine Zeile dasteht.
Ein Ansatz war:
PHP:
$control_chars = array("\a", "\t", "\b", "\n", "\v", "\f", "\r");
$nothing = array("",   "",   "",   "",   "",   "",   "");

$html = str_replace($control_chars, $nothing, $html);
Allerdings entfernt dies auch manchmal Leerräume, die da bleiben sollen (zur Formatierung,...).
Ein weiterer Gedanke war:
PHP:
$in_tag = false;
$chars = str_split($html);
$new_html = "";

for ($i=0; $i<count($chars); $i++)
{
  if ($chars[$i]=="<")
    $in_tag = true;
  else if ($chars[$i]==">")
    $in_tag = false;

  if ($chars[$i]==" " && $in_tag==false)
    continue;

  $new_html .= $chars[$i];
}
Allerdings funktioniert das auch nicht richtig.

Kann mir jemand einen Tipp geben, wie man den Code erweitern/verändern könnte, sodass er funktioniert?
Oder kennt jemand eine fertige Funktion/Klasse?

Vielen Dank schonmal im Voraus!
 
Warum nutzt du zum Optimieren nicht lieber HTTP compression oder andere bewährte Methoden?

Der Algorithmus, um die Leerzeichen zu entfernen, wäre wahrscheinlich nicht effizient genug, um zu optimieren, sondern würde vielmehr das Gegenteil bewirken.
 
Zuletzt bearbeitet:
...
Kann mir jemand einen Tipp geben, wie man den Code erweitern/verändern könnte, sodass er funktioniert?
Oder kennt jemand eine fertige Funktion/Klasse?
Hallo,

wenn du XHTML als Ausgangsdokument hast, dann würde sich eine XSL-Transformation mit einem Ident-Copy-Stylesheet prima dafür eignen. Damit könnte man auch alle Kommentare aus dem Dokument filtern. Hier mal ein Beispiel mit einem (X)HTML5-Dokument:
PHP:
$xmlProlog = '<?xml version="1.0" encoding="UTF-8"?>';

$xhtmlDocument = <<< EOT
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta charset="UTF-8" />
    <title>Example Only</title>
    <link type="text/css" rel="stylesheet" href="style.css" />
    <!--
     | Unbedingt externes Script und erzwungenes Leerzeichen
     | zwischen den Script-Tags notwendig!
     +-->
		<script type="text/javascript" src="external.js"> </script>
  </head>
  <body>
    <h1>Here Is Your Heading</h1>
    <p>This is the first paragraph of your web page.</p>
    <dl>
      <dt>Source:</dt>
      <dd>
        <a href="http://www.html-5.com/tags/xml-stylesheet-instruction/" rel="external" target="_blank">
          http://www.html-5.com/tags/xml-stylesheet-instruction/
        </a>
      </dd>
    </dl>
  </body>
</html>
EOT;

$xmlDoc = $xmlProlog . $xhtmlDocument;

$xslDoc = <<< EOT
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
  version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
  <xsl:output
    method="xml"
    doctype-system="about:legacy-compat"
    encoding="UTF-8"
    omit-xml-declaration="yes"
    indent="no"
  />
  <xsl:strip-space elements="*" />
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
  </xsl:template>
  <!-- Filtert alle Kommentare aus: -->
  <xsl:template match="comment()" />
</xsl:stylesheet>
EOT;

$xmlObj = new DomDocument();
$xmlObj -> loadXML($xmlDoc);

$xslObj = new DomDocument();
$xslObj -> loadXML($xslDoc);

$xsltRes = new XSLTProcessor;
$xsltRes -> importStylesheet($xslObj);
$xsl_output = $xsltRes -> transformToXML($xmlObj);

header('Content-type: text/html');
print $xsl_output;
Übrigens funktioniert das auch umgekehrt: Wenn man das indent-Attribut im output-Element auf "yes" setzt, dann erhält man ein ordentlich eingerücktes Pretty-Print-Dokument.

Einzelheiten zur XSL-Transformation von XHTML zu XHTML kann man hier nachlesen: http://www.xmlplease.com/xhtmlxhtml
 
Warum nutzt du zum Optimieren nicht lieber HTTP compression oder andere bewährte Methoden?

Der Algorithmus, um die Leerzeichen zu entfernen, wäre wahrscheinlich nicht effizient genug, um zu optimieren, sondern würde vielmehr das Gegenteil bewirken.

Ich nutze bereits die GZIP-Komprimierung, sofern das der Browser unterstützt.
Du meinst also, dass diese Optimierung garnichts bis eher das umgekehrte bringt?

Meine Komprimierung ist so aufgebaut, dass der Quellcode komprimiert wird und dann gecacht wird.
Beim nächsten Aufruf - sofern der MD5-Hash gleich ist - wird aus dem Cache geladen.
Somit bringt doch das Entfernen der Leerzeichen etwas, oder?

@hela:

Leider habe ich nicht XHTML aus Ausgangsdokument und ich kann es auch nicht ändern.
Ich hatte auch versucht das Dokument zuerst mit SimpleXML zu laden und dann auszugeben, nur kommen natürlich einige Fehler!
 
Zurück