PHP/XML, HTML und XHTML

Aus Mikiwiki
< PHP
Zur Navigation springen Zur Suche springen

Wohlgeformte Dokuemnte sind im World Wide Web eher selten anzutreffen. Die XML-Bibliothek "libxml2" verfügt deshalb über einige Funktionen, die XML und HTML verbinden können. Dafür stellt die Klasse "DomDocument" folgende Methoden zur Verfügung.

Methode Beschreibung
LoadHTML Lädt ein HTML-Dokument aus einer Zeichenkette.
LoadHTMLFile Lädt ein HTML-Dokument aus einer Datei. Hier sind alle üblichen Wrapper erlaubt, sodass auch Dokumente von anderen Servern per FTP oder HTTP geladen werden können.
SaveHTML Speichert das XML-Dokument im nicht wohlgeformten, aber HTML 4-Standard kompatiblen Format als Zeichenkette.
SaveHTMLFile Speichert das XML-Dokument im nicht wohlgeformten, aber HTML 4-Standard kompatiblen Format als Datei. Hier sind mit Einschränkungen einige Wrapper erlaubt, sodass auch Dokumente auf anderen Server (z. B. mit FTP) gespeichert werden können.

Das folgende Beispiel lädt eine nicht wohlgeformte (also typische) HTML-Datei und gibt sie in drei Fassungen aus:

  1. Unverändert
  2. Als standardkonforme HTML-Datei
  3. Als wohlgeformtes XML-Datei, also als XHTML

Das Skript durchsucht das aktuelle Verzeichnis nach Dateien mit der Dateinamenserweiterung ".htm*". Wird auf eine der als Link angezeigten Fundstellen geklickt, so wird die Datei in drei Fassungen angezeigt. Die Übergabe des Dateinamens erfolgt als GET-Parameter. Die Ausgabe nutzt die Funktion "htmlspecialchars", um den Quleltext sichtbar werden zu lassen. Andernfalls würde der Webbrowser die Seite interpretieren. Mit der Funktion "nl2br" bleiben zudem die Zeilenumbrüche erhalten.

<html>
<head>
  <title>HTML laden</title>
</head>
<body>    
<?php
$self  = $_SERVER['PHP_SELF'];
$files = glob("{*.htm*}", GLOB_BRACE); 
if (is_array($files))
{
  foreach ($files as $filename)
  {
    printf('<a href="%2$s?file=%1$s">%1$s</a><br />', $filename, $self);    
  }
}
if (isset($_GET['file']))
{
  $html = new DomDocument();
  $html->loadHTMLFile($_GET['file']);
  $file = file_get_contents($_GET['file']);
  echo "<hr>";
  echo nl2br(htmlspecialchars($file));
  echo "<hr>";
  echo nl2br(htmlspecialchars($html->saveHTML()));
  echo "<hr>";
  echo nl2br(htmlspecialchars($html->saveXML()));
}
?>
</body>
</html>

<html> <head>

 <title>HTML laden</title>

</head> <body>

testdatei.htm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html>
<head>
<title>Der Titel</title>

<meta name="author" content="Hermann Meier">
</head>
<body>
<h1>Test</h1>
Diese Linie ist nicht XML-konform:
<hr size=4 noshade>


</body>
</html>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html>
<head>
<title>Der Titel</title>
<meta name="author" content="Hermann Meier">

</head>
<body>
<h1>Test</h1>
Diese Linie ist nicht XML-konform:
<hr size="4" noshade>
</body>

</html>


<?xml version="1.0" standalone="yes"?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "">
<html><head><title>Der Titel</title><meta name="author" content="Hermann Meier"/></head><body>&#xD;

<h1>Test</h1>&#xD;
Diese Linie ist nicht XML-konform:&#xD;
<hr size="4" noshade="noshade"/></body></html>

</body> </html>

Das "Reinigen" von schlecht geschriebenem HTML ist allerdings nicht die Hauptaufgabe des HTML-Imports und -Exports. Dafür sind die Tidy-Erweiterungen in PHP5 besser geeignet, die mehr Steuerungsmöglichkeiten zulassen.Es gibt nämlich uneindeutige Fälle, vor allem im Zusammenhang mit den Tags "<br>" und "<p>", die sich nicht immer vollautomatisch umsetzen lassen.