我构建了一个脚本,它将页面上的所有css组合在一起,以便在我的cms中使用它。它工作很长时间我现在得到这个错误:
警告:DOMDocument :: loadHTML() [domdocument.loadhtml]:实体中的标题标题无效,行:10英寸 第 26 行 css.php 警告: DOMDocument :: loadHTML()[domdocument.loadhtml]:标签导航无效 实体,行: css.php 中的10行 26
警告: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;
}
答案 0 :(得分:124)
Header,Nav和Section是HTML5中的元素。因为HTML5开发人员认为记住公共标识符和系统标识符太难了,所以DocType声明只是:
<!DOCTYPE html>
换句话说,没有要检查的DTD,这将使DOM使用HTML4 Transitional DTD并且不包含这些元素,因此警告。
要压制警告,请输入
libxml_use_internal_errors(true);
在致电loadHTML
和之前
libxml_use_internal_errors(false);
之后。
答案 1 :(得分:6)
使用DOMDocument对象,应该可以在加载方法之前放置@,以禁止所有警告。
$dom = new DOMDocument;
@$dom->loadHTML($source);
继续。
答案 2 :(得分:0)
仍不支持HTML5元素,但是您可以使用$options
参数完全消除libxml错误。
只需设置
$doc = new DOMDocument();
$doc->loadHTMLFile("html5.html", LIBXML_NOERROR);
此选项比@
优先使用,该选项使PHP错误消失。
但是请注意,libxml非常宽容,它将解析损坏的HTML文档。 如果您忽略libxml错误,您甚至可能都不知道HTML格式错误。
答案 3 :(得分:0)
大多数人不是意识到HTML和XML之间的区别,即语言和HTML和XML在解析器方面的区别。解析器需要代码,而HTML和XML解析器则完全不同。尽管XML解析器在浏览器中可以容忍一些小问题(例如重复的id
值),但它们不会与看起来像代码的垃圾一样。
PHP的XML解析器更加严格,并且不允许重复的id
值。另外,由于任何元素都可以作为元素(例如footer
,header
,section
),PHP的XML解析器将不会抱怨未知的HTML5 +元素。
$dom->loadXML($xml);
对于在客户端开发的任何人,我强烈建议使用XML解析器来处理您的HTML5代码,并且由于我从2000年代开始开发到2020年,因此Gecko浏览器(例如Waterfox,Firefox)拥有最好的XML解析器,因为整个页面都将中断,您会收到一条 explicit 错误消息。如果您可以理解质量,则更严格的代码会产生更好的结果,尽管事实并非如此。