Mise à jour: html5lib
(en bas de la question) semble se rapprocher, j'ai juste besoin d'améliorer ma compréhension de la façon dont il est utilisé.
J'essaie de trouver un HTML5 compatible DOM parser pour PHP 5.3. En particulier, j'ai besoin d'accéder à la page suivante HTML CDATA à l'intérieur d'une balise de script:
<script type="text/x-jquery-tmpl" id="foo">
<table><tr><td>${name}</td></tr></table>
</script>
La plupart des analyseurs ce sera la fin de l'analyse prématurément en raison HTML 4.01 se termine balise de script d'analyse quand il trouve ETAGO (</
) à l'intérieur d'un <script>
balise. Cependant, HTML5 permet de </
avant </script>
. Tous les analyseurs j'ai essayé jusqu'à présent ont soit échoué, ou ils sont si mal documenté que je n'ai pas compris si elles travaillent ou non.
Mes exigences:
- Réel de l'analyseur, pas de regex hacks.
- Capacité de chargement complet des pages ou des fragments de HTML.
- Capacité à tirer script contenu arrière, la sélection par l'attribut id de la balise.
Entrée:
<script id="foo"><td>bar</td></script>
Exemple de défaut de sortie (pas de clôture, </td>
):
<script id="foo"><td>bar</script>
Certains analyseurs et de leurs résultats:
DOMDocument (échoue)
Source:
<?php
header('Content-type: text/plain');
$d = new DOMDocument;
$d->loadHTML('<script id="foo"><td>bar</td></script>');
echo $d->saveHTML();
Sortie:
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 (échoue)
Source:
<?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');
Sortie:
<!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 (échoue)
Source:
<?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');
Sortie:
<script type="text/x-jquery-tmpl" id="foo">
<td>test
</script>
html5lib (passe)
Éventuellement prometteur. Puis-je obtenir le contenu de l' script#foo
balise?
Source:
<?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();
Sortie:
<html><head></head><body><script id="foo"><td></td></script></body></html>