HTML5 tarzı sağlar DOM çözümleyici

0 Cevap php

Update: html5lib (soru alt) yakın olsun gibi görünüyor, ben sadece nasıl kullanıldığını benim anlayış geliştirmek gerekir.

PHP 5.3 için bir HTML5 uyumlu DOM ayrıştırıcı bulmak için çalışılıyor. Özellikle, ben bir komut dosyası etiketi içinde şu HTML gibi CDATA erişmek gerekir:

<script type="text/x-jquery-tmpl" id="foo">
    <table><tr><td>${name}</td></tr></table>
</script>

En ayrıştırıcılar erken ayrıştırma sona erecek, çünkü HTML 4.01 ends script tag parsing Ne (</), bir <script> etiketinin içine ETAGO bulduğunda. Bununla birlikte, HTML5 allows için </ before </script>. Ben şimdiye kadar denedim ayrıştırıcıların hepsi ya başarısız olmuş, ya da çok kötü ya da değil çalışmak eğer ben anladım değil ki belgelenmiştir.

Benim gereksinimleri:

  1. Gerçek ayrıştırıcı, kesmek regex değil.
  2. Tam sayfaları veya HTML parçaları yüklemek için yeteneği.
  3. Etiketinin id niteliği tarafından seçilmesi, dışarı contents komut çekme yeteneği.

Girdi:

<script id="foo"><td>bar</td></script>

Başarısız çıkış örneği (hayır kapanış </td>):

<script id="foo"><td>bar</script>

Bazı ayrıştırıcılar ve sonuçları:


DOMDocument (fails)

Source:

<?php

header('Content-type: text/plain');
$d = new DOMDocument;
$d->loadHTML('<script id="foo"><td>bar</td></script>');
echo $d->saveHTML();

Çıktı:

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 (fails)

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');

Çıktı:

<!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 (fails)

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');

Çıktı:

<script type="text/x-jquery-tmpl" id="foo">
<td>test
</script>


html5lib (passes)

Muhtemelen umut verici. Ben script#foo etiketinin içeriğini de alabilir miyim?

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();

Çıktı:

<html><head></head><body><script id="foo"><td></td></script></body></html>

0 Cevap