【发布时间】:2011-05-01 01:40:47
【问题描述】:
更新:html5lib(问题的底部)似乎接近了,我只需要提高对它的使用方式的理解。
我正在尝试为 PHP 5.3 寻找与 HTML5 兼容的 DOM 解析器。特别是,我需要在脚本标签中访问以下类似 HTML 的 CDATA:
<script type="text/x-jquery-tmpl" id="foo">
<table><tr><td>${name}</td></tr></table>
</script>
大多数解析器会提前结束解析,因为 HTML 4.01 ends script tag parsing 在 <script> 标记内找到 ETGO (</) 时。但是,HTML5 allows for </ 在 </script> 之前。到目前为止,我尝试过的所有解析器都失败了,或者它们的文档记录太差,以至于我不知道它们是否有效。
我的要求:
- 真正的解析器,而不是正则表达式破解。
- 能够加载整个页面或 HTML 片段。
- 能够拉回脚本内容,通过标签的 id 属性进行选择。
输入:
<script id="foo"><td>bar</td></script>
失败输出示例(不关闭</td>):
<script id="foo"><td>bar</script>
一些解析器及其结果:
DOMDocument(失败)
来源:
<?php
header('Content-type: text/plain');
$d = new DOMDocument;
$d->loadHTML('<script id="foo"><td>bar</td></script>');
echo $d->saveHTML();
输出:
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(失败)
来源:
<?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');
输出:
<!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(失败)
来源:
<?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');
输出:
<script type="text/x-jquery-tmpl" id="foo">
<td>test
</script>
html5lib(通过)
可能很有希望。我可以得到script#foo标签的内容吗?
来源:
<?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();
输出:
<html><head></head><body><script id="foo"><td></td></script></body></html>
【问题讨论】:
-
注意:当您尝试通过 loadHTML 解析 HTML 时,基于 DOM 的库将使用 libxml 的 HTML 解析器模块。如果您使用 loadXML 加载上面的 sn-p,则不会出现错误,但是当然,页面应该是有效的 XHTML。另请参阅Best Methods to parse HTML,但基本上所有基于 DOM 的解析器都可能在这里产生相同的结果。
-
+1 提出一个好问题。我想知道是否可以使用 HTML cmets 或 CDATA 块来分隔脚本标记中的代码,就像对 Javascript 所做的那样?或者这也会包含在模板的输出中?
-
如果 html5lib 通过不就是这个问题的答案吗?