DOMDocument::loadHTMLFile

(PHP 5, PHP 7, PHP 8)

DOMDocument::loadHTMLFile 从文件加载 HTML

描述

public DOMDocument::loadHTMLFile(string $filename, int $options = 0): bool

该函数解析名为 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

HTML 文件的路径。

options

按位 OR libxml 选项常量

返回值

成功时返回 true,失败时返回 false

错误/异常

如果将空字符串作为 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();
?>

参见

添加注释

用户贡献注释 6 个注释

onemanbanddan at gmail dot com
10 年前
用于抑制错误和警告的选项不会像 loadXML() 那样在此函数中起作用
例如
<?php
$doc
->loadHTMLFile($file, LIBXML_NOWARNING | LIBXML_NOERROR);
?>
不起作用。
您必须使用
<?php
libxml_use_internal_errors
(true);
$doc->loadHTMLFile($file);
?>
并根据需要处理异常。
Mark Omohundro, ajamyajax dot com
15 年前
<?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";
}
}
}
?>
qrworld.net
9 年前
在这篇文章 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();
}
andy at carobert dot com
19 年前
这将 HTML 放入一个 DOM 对象中,该对象可以按单个标签、属性等进行解析。这是一个获取所有 'href' 属性和相应的节点值的示例,这些属性和值来自 'a' 标签。非常酷....

<?php
$myhtml
= <<<EOF
<html>
<head>
<title>My Page</title>
</head>
<body>
<p><a href="/mypage1">Hello World!</a></p>
<p><a href="/mypage2">Another 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!
gzech at SPAMFILTER dot eso dot org
17 年前
如果你想抑制 `loadHTMLFile($url)` 的输出警告,在前面加上 `@` 符号。这甚至在
<?php
$load
= @$dom->loadHTMLFile($url);
?>
bens at effortlessis dot com
19 年前
请注意,此函数不会解析 HTML 文件中的各个标签 - 它全部作为“黑盒”加载,你最终得到一个 XML 小部件,它只包含完整的 HTML 块。

我原本希望它可以作为一种 HTML 验证器/解析器,但似乎并非如此。
To Top