Wie kann HTML5 mit DOMDocument funktionieren?

Ich versuche, HTML-Code mit DOMDocument zu analysieren, Dinge wie Änderungen daran vorzunehmen und ihn dann wieder zu einer Zeichenfolge zusammenzusetzen, die ich an die Ausgabe sende.

Aber es gibt ein paar Probleme beim Parsen, was bedeutet, dass das, was ich an DOMDocument sende, nicht immer in der gleichen Form zurückkommt :)

Hier ist eine Liste:

mit-> loadHTML:

formatiert mein Dokument unabhängig von derpreserveWhitespace undformatOutput Einstellungen (Leerzeichen bei vorformatiertem Text verlieren)gibt mir fehler wenn ich html5 tags mag<header>, <footer> usw. Aber sie können unterdrückt werden, damit ich damit leben kann.erzeugt inkonsistente Markups - zum Beispiel, wenn ich ein<link ... /> Element (mit einem selbstschließenden Tag), nach dem Parsing / saveHTML wird die Ausgabe erfolgen<link .. >

mit-> loadXML:

kodiert Entitäten wie> von<style> oder<script> Stichworte:body > div wirdbody &gt; divBeispielsweise werden alle Tags auf dieselbe Weise geschlossen<meta ... /> wird<meta...></meta>; Dies kann aber mit einem regulären Ausdruck behoben werden.

Ich habe HTML5lib nicht ausprobiert, aber ich würde aus Leistungsgründen DOMDocument einem benutzerdefinierten Parser vorziehen

Aktualisieren:

So wie das erwähnte Honeymonster mit CDATA das Hauptproblem mit loadXML behebt.

Gibt es eine Möglichkeit, das Selbstschließen aller leeren HTML-Tags außer einer bestimmten Menge zu verhindern, ohne Regex zu verwenden?

Gerade habe ich:

$html = $dom->saveXML($node);

$html = preg_replace_callback('#<(\w+)([^>]*)\s*/>#s', function($matches){

       // ignore only these tags
       $xhtml_tags = array('br', 'hr', 'input', 'frame', 'img', 'area', 'link', 'col', 'base', 'basefont', 'param' ,'meta');

       // if a element that is not in the above list is empty,
       // it should close like   `<element></element>` (for eg. empty `<title>`)
       return in_array($matches[1], $xhtml_tags) ? "<{$matches[1]}{$matches[2]} />" : "<{$matches[1]}{$matches[2]}></{$matches[1]}>";
}, $html);

das funktioniert, aber es wird auch die Ersetzungen in den CDATA-Inhalten tun, die ich nicht will ...

Antworten auf die Frage(5)

Ihre Antwort auf die Frage