PHP/XML, HTML und XHTML
Aus Mikiwiki
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:
- Unverändert
- Als standardkonforme HTML-Datei
- 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> |
<!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>
 <h1>Test</h1>
 Diese Linie ist nicht XML-konform:
 <hr size="4" noshade="noshade"/></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.
