Html5-tag 上的 PHP DOMDocument 错误/警告

我一直在尝试解析 HTML5代码,以便在代码中设置属性/值,但 DOMDocument (PHP5.3)似乎不支持像 <nav><section>这样的标记。

有没有办法在 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 () : Tag 导航在实体中无效,行: 4 in /home/wbkrnl/public _ html/new-mvc/1. php 在17号线

警告: DOMDocument: : loadHTML () : Tag 段在实体中无效,行: 10 in /home/wbkrnl/public _ html/new-mvc/1. php 在17号线

73860 次浏览

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

您的最佳可行解决方案将是禁用与 libxml_use_internal_errors的错误报告:

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

你也可以

@$dom->loadHTML($htmlString);

您可以筛选从解析器得到的错误。根据这里的其他答案,关闭向屏幕报告的错误,然后迭代这些错误,只显示您想要的错误:

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 标记更改头标记,并使用 id。例如:

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

这不是最好的解决方案,但根据情况它可能是有用的。

祝你好运。

HTML5标签几乎总是使用诸如 id、 class 等属性:

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

似乎没有一种方法可以消除警告但不能消除错误。PHP 有一些常量可以做到这一点,但是它们似乎不起作用。这里是什么是应该工作,但不是因为(错误?)....

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

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