样式</ in <script>标签

更新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在<script>标记内找到ETAGO( </ )时,它将结束脚本标记解析。 但是,HTML5允许</之前</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>
    

    我有同样的问题,显然你可以通过加载文档为XML来破解你的方式,并保存为HTML :)

    $d = new DOMDocument;
    $d->loadXML('<script id="foo"><td>bar</td></script>');
    echo $d->saveHTML();
    

    但是,当然,为了使loadXML正常工作,标记必须没有错误。


    Re:html5lib

    您点击下载选项卡并下载解析器的PHP版本。

    您解压本地文件夹中的存档

     tar -zxvf html5lib-php-0.1.tar.gz
     x html5lib-php-0.1/
     x html5lib-php-0.1/VERSION
     x html5lib-php-0.1/docs/
     ... etc
    

    您更改目录并创建一个名为hello.php的文件

    cd html5lib-php-0.1
    touch hello.php 
    

    您将以下PHP代码放在hello.php

    $html = '<html><head></head><body>
    <script type="text/x-jquery-tmpl" id="foo">
    <table><tr><td>${name}</td></tr></table>
    </script> 
    </body></html>';
    $dom = HTML5_Parser::parse($html); 
    var_dump($dom->saveXml()); 
    echo "nDonen";
    

    你从命令行运行hello.php

    php hello.php
    

    解析器将解析文档树,并返回一个DOMDocument对象,该对象可以像任何其他DOMDocument对象一样进行操作。


    FluentDOM使用DOMDocument但阻止加载通知和警告。 它没有自己的解析器。 你可以添加自己的加载器(例如使用html5lib的加载器)。

    链接地址: http://www.djcxy.com/p/5073.html

    上一篇: style </ in <script> tag

    下一篇: A simple program to CRUD node and node values of xml file