PHP Conference Japan 2024

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();
?>

参见

添加注释

用户贡献的注释 4 条注释

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
16 年前
<?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";
}
}
}
?>
andy at carobert dot com
19 年前
这将 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!
qrworld.net
10 年前
在这篇文章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();
}
To Top