抑制错误和警告的选项在此处不起作用,与 loadXML() 的作用不同。
例如
<?php
$doc->loadHTMLFile($file, LIBXML_NOWARNING | LIBXML_NOERROR);
?>
不起作用。
您必须使用
<?php
libxml_use_internal_errors(true);
$doc->loadHTMLFile($file);
?>
并根据需要处理异常。
(PHP 5, PHP 7, PHP 8)
DOMDocument::loadHTMLFile — 从文件中加载 HTML
此函数解析名为 filename
文件中的 HTML 文档。与加载 XML 不同,HTML 不必是格式良好的才能加载。
此函数使用 HTML 4 解析器解析输入。现代 Web 浏览器使用的 HTML 5 的解析规则有所不同。根据输入,这可能会导致不同的 DOM 结构。因此,此函数不能安全地用于清理 HTML。
解析 HTML 时的行为可能取决于正在使用的 libxml
版本,尤其是在边缘情况和错误处理方面。对于符合 HTML5 规范的解析,请使用 PHP 8.4 中添加的 Dom\HTMLDocument::createFromString() 或 Dom\HTMLDocument::createFromFile()。
例如,某些 HTML 元素会在遇到时隐式关闭父元素。自动关闭父元素的规则在 HTML 4 和 HTML 5 之间有所不同,因此 DOMDocument看到的 DOM 结构可能与 Web 浏览器看到的 DOM 结构不同,这可能会允许攻击者破坏生成的 HTML。
如果将空字符串作为 filename
传递或命名为空文件,则会生成警告。此警告不是由 libxml 生成的,不能使用 libxml 的错误处理函数 来处理。
虽然格式错误的 HTML 应该能够成功加载,但是当此函数遇到错误标记时,可能会生成 E_WARNING
错误。libxml 的错误处理函数 可用于处理这些错误。
版本 | 描述 |
---|---|
8.3.0 | 此函数现在具有暂定的 bool 返回类型。 |
8.0.0 | 静态调用此函数现在将抛出 Error。以前,会引发 E_DEPRECATED 。 |
示例 #1 创建文档
<?php
$doc = new DOMDocument();
$doc->loadHTMLFile("filename.html");
echo $doc->saveHTML();
?>
抑制错误和警告的选项在此处不起作用,与 loadXML() 的作用不同。
例如
<?php
$doc->loadHTMLFile($file, LIBXML_NOWARNING | LIBXML_NOERROR);
?>
不起作用。
您必须使用
<?php
libxml_use_internal_errors(true);
$doc->loadHTMLFile($file);
?>
并根据需要处理异常。
<?php
// 尝试此 HTML 列表示例以获取所有节点 / 包括一些 getElementsByTagName 选项:
$file = $DOCUMENT_ROOT. "test.html";
$doc = new DOMDocument();
$doc->loadHTMLFile($file);
// 示例 1:
$elements = $doc->getElementsByTagName('*');
// 示例 2:
$elements = $doc->getElementsByTagName('html');
// 示例 3:
//$elements = $doc->getElementsByTagName('body');
// 示例 4:
//$elements = $doc->getElementsByTagName('table');
// 示例 5:
//$elements = $doc->getElementsByTagName('div');
if (!is_null($elements)) {
foreach ($elements as $element) {
echo "<br/>". $element->nodeName. ": ";
$nodes = $element->childNodes;
foreach ($nodes as $node) {
echo $node->nodeValue. "\n";
}
}
}
?>
这将 HTML 放入可以按单个标签、属性等进行解析的 DOM 对象中。这是一个从“a”标签中获取所有“href”属性和相应节点值的示例。非常酷……
<?php
$myhtml = <<<EOF
<html>
<head>
<title>我的页面</title>
</head>
<body>
<p><a href="/mypage1">Hello World!</a></p>
<p><a href="/mypage2">另一个Hello World!</a></p>
</body>
</html>
EOF;
$doc = new DOMDocument();
$doc->loadHTML($myhtml);
$tags = $doc->getElementsByTagName('a');
foreach ($tags as $tag) {
echo $tag->getAttribute('href').' | '.$tag->nodeValue."\n";
}
?>
这段代码应该输出
/mypage1 | Hello World!
/mypage2 | Another Hello World!
在这篇文章http://softontherocks.blogspot.com/2014/11/descargar-el-contenido-de-una-url_11.html中,我发现了一种使用DOMDocument、loadHTMLFile和saveHTML()简单获取URL内容的方法。
function getURLContent($url){
$doc = new DOMDocument;
$doc->preserveWhiteSpace = FALSE;
@$doc->loadHTMLFile($url);
return $doc->saveHTML();
}