Php DOMDocument::loadHTML错误
我构建了一个脚本,将页面上的所有css组合在一起,以便在我的cms中使用它。它很长一段时间都运行良好,现在我发现了这个错误:Php DOMDocument::loadHTML错误,php,html,domdocument,Php,Html,Domdocument,我构建了一个脚本,将页面上的所有css组合在一起,以便在我的cms中使用它。它很长一段时间都运行良好,现在我发现了这个错误: 警告:DOMDocument::loadHTML() [domdocument.loadhtml]:标记头在实体中无效,第10行在 第26行的css.php警告: DOMDocument::loadHTML()[DOMDocument.loadHTML]:标记导航在中无效 实体,第26行css.php中的第10行 警告:DOMDocument::loadHTML()[DO
警告:DOMDocument::loadHTML() [domdocument.loadhtml]:标记头在实体中无效,第10行在 第26行的css.php
警告: DOMDocument::loadHTML()[DOMDocument.loadHTML]:标记导航在中无效 实体,第26行css.php中的第10行
警告:DOMDocument::loadHTML()[DOMDocument.loadHTML]:标记 实体中的节无效,css.php中的第22行 26
这是php脚本
这是我的代码:
<?php
header('Content-type: text/css');
include ('../global.php');
if ($usetpl == '1') {
$client = New client();
$tplname = $client->template();
$location = "../templates/$tplname/header.php";
$page = file_get_contents($location);
} else {
$page = file_get_contents('../index.php');
}
class StyleSheets extends DOMDocument implements IteratorAggregate
{
public function __construct ($source)
{
parent::__construct();
$this->loadHTML($source);
}
public function getIterator ()
{
static $array;
if (NULL === $array) {
$xp = new DOMXPath($this);
$expression = '//head/link[@rel="stylesheet"]/@href';
$array = array();
foreach ($xp->query($expression) as $node)
$array[] = $node->nodeValue;
}
return new ArrayIterator($array);
}
}
foreach (new StyleSheets($page) as $index => $file) {
$css = file_get_contents($file);
echo $css;
}
Header、Nav和Section是HTML5中的元素。由于HTML5开发人员觉得很难记住公共和系统标识符,DocType声明只是:
<!DOCTYPE html>
在调用loadHTML
和
libxml_use_internal_errors(false);
在它之后
另一种方法是对DOMDocument对象使用。,您应该能够在load方法之前放置@,以便抑制所有警告
$dom = new DOMDocument;
@$dom->loadHTML($source);
HTML5元素仍然不受支持,但您可以使用$options
参数完全消除libxml错误
刚定
$doc = new DOMDocument();
$doc->loadHTMLFile("html5.html", LIBXML_NOERROR);
此选项优先于消除PHP错误的@
但是要小心,libxml非常宽容,它会解析一个损坏的HTML文档如果您对libxml错误保持沉默,您可能甚至没有意识到HTML格式不正确。大多数人没有意识到HTML和XML作为语言与HTML和XML在解析器方面的区别。解析器接受代码,HTML和XML解析器完全不同。虽然XML解析器在浏览器中会容忍一些次要的事情(例如重复id
值),但它们不会处理看起来像代码的垃圾
PHP的XML解析器更为严格,不允许重复的id
值。此外,由于任何东西都可以是元素(例如,页脚
,页眉
,节
),PHP的XML解析器不会抱怨未知的HTML5+元素
$dom->loadXML($xml);
对于任何在客户端开发的人,我强烈建议使用XML解析器来处理HTML5代码,因为我从2000年代到2020年开始开发Gecko浏览器(如Waterbox、Firefox),它拥有最好的XML解析器,因为整个页面都会断开,您会得到一条明确的错误消息。如果您能够理解质量最终会产生数量,那么更严格的代码会产生更好的结果,尽管事实并非如此。这样做了,现在我得到一个空白page@user1079160这是另一个问题!戈登有个好答案,谢谢@戈丹:如何修复空白页问题?我有同样的空白页问题。我的错误是使用了print$document->saveXML()
而不是$document->saveHTML()
。HTML版本不像XML版本那样进行某些格式转换。如果这不是问题所在,请尝试检查输出源,以查看是否存在标记(如果有的话)。它会让你知道引擎盖下发生了什么。另外,不要忘记var\u dump
!PHP报告了这个问题,在这个问题上,底层libxml2中产生了一个特性请求:这是一个糟糕的解决方案,因为这一行中的错误将成为调试的噩梦@戈登的解决方案要好得多。
$dom->loadXML($xml);