更新情報 : html5lib
(unten in der Frage) scheint nahe dran zu sein, ich muss nur noch besser verstehen, wie es verwendet wird.
Ich versuche, einen HTML5-kompatiblen DOM-Parser für PHP 5.3 zu finden. Insbesondere muss ich auf das folgende HTML-ähnliche CDATA innerhalb eines Skript-Tags zugreifen:
<script type="text/x-jquery-tmpl" id="foo">
<table><tr><td>${name}</td></tr></table>
</script>
Die meisten Parser beenden das Parsen vorzeitig, da HTML 4.01 beendet das Parsen von Skript-Tags wenn es ETAGO findet ( </
) innerhalb einer <script>
Tag. Allerdings ist HTML5 ermöglicht </
antes de </script>
. Alle Parser, die ich bisher ausprobiert habe, sind entweder gescheitert, oder sie sind so schlecht dokumentiert, dass ich nicht herausgefunden habe, ob sie funktionieren oder nicht.
Meine Anforderungen:
- Echter Parser, keine Regex-Hacks.
- Möglichkeit, ganze Seiten oder HTML-Fragmente zu laden.
- Fähigkeit, Skript zu ziehen Inhalt zurück, wobei die Auswahl über das Attribut id des Tags erfolgt.
Eingabe:
<script id="foo"><td>bar</td></script>
Beispiel einer fehlgeschlagenen Ausgabe (kein Schließen) </td>
):
<script id="foo"><td>bar</script>
Einige Parser und ihre Ergebnisse:
DOMDocument (scheitert)
Quelle:
<?php
header('Content-type: text/plain');
$d = new DOMDocument;
$d->loadHTML('<script id="foo"><td>bar</td></script>');
echo $d->saveHTML();
Ausgabe:
Warning: DOMDocument::loadHTML(): Unexpected end tag : td in Entity, line: 1 in /home/adam/public_html/2010/10/26/dom.php on line 5
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><head><script id="foo"><td>bar</script></head></html>
FluentDOM (scheitert)
Quelle:
<?php
header('Content-type: text/plain');
require_once 'FluentDOM/src/FluentDOM.php';
$html = "<html><head></head><body><script id='foo'><td></td></script></body></html>";
echo FluentDOM($html, 'text/html');
Ausgabe:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><head></head><body><script id="foo"><td></script></body></html>
phpQuery (scheitert)
Quelle:
<?php
header('Content-type: text/plain');
require_once 'phpQuery.php';
phpQuery::newDocumentHTML(<<<EOF
<script type="text/x-jquery-tmpl" id="foo">
<td>test</td>
</script>
EOF
);
echo (string)pq('#foo');
Ausgabe:
<script type="text/x-jquery-tmpl" id="foo">
<td>test
</script>
html5lib (Pässe)
Möglicherweise vielversprechend. Kann ich an den Inhalt des script#foo
Tag?
Quelle:
<?php
header('Content-type: text/plain');
include 'HTML5/Parser.php';
$html = "<!DOCTYPE html><html><head></head><body><script id='foo'><td></td></script></body></html>";
$d = HTML5_Parser::parse($html);
echo $d->saveHTML();
Ausgabe:
<html><head></head><body><script id="foo"><td></td></script></body></html>
1 Stimmen
Hinweis: Wenn Sie versuchen, HTML über loadHTML zu parsen, verwenden DOM-basierte Bibliotheken das HTML-Parser-Modul von libxml. Wenn Sie Ihr obiges Snippet stattdessen mit loadXML laden, treten keine Fehler auf, aber natürlich wird erwartet, dass die Seite dann gültiges XHTML ist. Siehe auch Beste Methoden zum Parsen von HTML aber im Grunde werden alle DOM-basierten Parser hier wahrscheinlich die gleichen Ergebnisse liefern.
0 Stimmen
+1 für eine gute Frage. Ich frage mich, ob es möglich wäre, HTML-Kommentare oder einen CDATA-Block zu verwenden, um den Code im Skript-Tag abzugrenzen, wie man es bei Javascript tun würde? Oder würde das auch in die Ausgabe der Vorlage aufgenommen werden?
0 Stimmen
Wenn html5lib angenommen wird, ist das dann nicht die Antwort auf diese Frage?