PHP的DOMDocument错误/警告html5标签

我一直试图parsingHTML5代码,所以我可以在代码中设置属性/值,但似乎DOMDocument(PHP5.3)不支持<nav><section>类的标签。

有没有什么办法parsing这个PHP的HTML和操纵代码?


代码重现:

 <?php $dom = new DOMDocument(); $dom->loadHTML("<!DOCTYPE HTML> <html><head><title>test</title></head> <body> <nav> <ul> <li>first <li>second </ul> </nav> <section> ... </section> </body> </html>"); 

错误

警告:DOMDocument :: loadHTML():在实体中标记nav无效,在第17行中的行4中的/home/wbkrnl/public_html/new-mvc/1.php

警告:DOMDocument :: loadHTML():实体中的标记部分无效,第17行中的/home/wbkrnl/public_html/new-mvc/1.php中的第10行

不,没有办法指定要使用的特定文档types,或者修改现有文档的要求。

你最好的可行的解决scheme将是禁用错误报告libxml_use_internal_errors

 $dom = new DOMDocument; libxml_use_internal_errors(true); $dom->loadHTML('...'); libxml_clear_errors(); 

你也可以做

 @dom->loadHTML($htmlString); 

您可以过滤从parsing器中获得的错误。 根据这里的其他答案,closures错误报告到屏幕,然后遍历错误,只显示你想要的:

 libxml_use_internal_errors(TRUE); // Do your load here $errors = libxml_get_errors(); foreach ($errors as $error) { /* @var $error LibXMLError */ } 

这是一个print_r()的单个错误:

 LibXMLError Object ( [level] => 2 [code] => 801 [column] => 17 [message] => Tag section invalid [file] => [line] => 39 ) 

通过匹配message和/或code ,这些可以被很容易地过滤掉。

这对我工作:

 $html = file_get_contents($url); $search = array("<header>", "</header>", "<nav>", "</nav>", "<section>", "</section>"); $replace = array("<div>", "</div>","<div>", "</div>", "<div>", "</div>"); $html = str_replace($search, $replace, $html); $dom = new DOMDocument(); $dom->loadHTML($html); 

如果您需要标题标签,请使用div标签更改标题并使用标识。 例如:

 $search = array("<header>", "</header>"); $replace = array("<div id='header1'>", "</div>"); 

这不是最好的解决scheme,但取决于情况,它可能是有用的。

祝你好运。

似乎没有办法来消除警告,但没有错误。 PHP有这样的常量,但它们似乎不起作用。 这是什么工作,但不是因为(bug?)….

  $doc=new DOMDocument(); $doc->loadHTML("<tagthatdoesnotexist><h1>Hi</h1></tagthatdoesnotexist>", LIBXML_NOWARNING ); echo $doc->saveHTML(); 

http://php.net/manual/en/libxml.constants.php

HTML5标签几乎总是使用id,class等属性。 所以replace的代码是:

 $html = file_get_contents($url); $search = array( "<header", "</header>", "<nav", "</nav>", "<section", "</section>", "<article", "</article>", "<footer", "</footer>", "<aside", "</aside>", "<noindex", "</noindex>", ); $replace = array( "<div", "</div>", "<div", "</div>", "<div", "</div>", "<div", "</div>", "<div", "</div>", "<div", "</div>", "<div", "</div>", ); $html = str_replace($search, $replace, $html); $dom = new DOMDocument(); $dom->loadHTML($html);