2024 日本 PHP 研討會

DOMDocument::loadHTMLFile

(PHP 5, PHP 7, PHP 8)

DOMDocument::loadHTMLFile 從檔案載入 HTML

說明

public DOMDocument::loadHTMLFile(字串 $filename, 整數 $options = 0): 布林值

此函式會解析名為 filename 的檔案中的 HTML 文件。與載入 XML 不同,HTML 不需要格式良好即可載入。

警告

此函式使用 HTML 4 解析器解析輸入。現代網頁瀏覽器使用的 HTML 5 解析規則不同。根據輸入內容,這可能會導致不同的 DOM 結構。因此,此函式不能安全地用於清理 HTML。

解析 HTML 時的行為取決於所使用的 libxml 版本,尤其是在邊緣情況和錯誤處理方面。對於符合 HTML5 規範的解析,請使用 PHP 8.4 新增的 Dom\HTMLDocument::createFromString()Dom\HTMLDocument::createFromFile()

例如,某些 HTML 元素在遇到時會隱式關閉父元素。自動關閉父元素的規則在 HTML 4 和 HTML 5 之間有所不同,因此 DOMDocument 看到的結果 DOM 結構可能與網路瀏覽器看到的 DOM 結構不同,這可能會讓攻擊者破壞結果 HTML。

參數

filename

HTML 檔案的路徑。

options

libxml 選項常數位元 OR 運算結果。

傳回值

成功時傳回 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">哈囉世界!</a></p>
<p><a href="/mypage2">另一個哈囉世界!</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 | 哈囉世界!
/mypage2 | 另一個哈囉世界!
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