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