使用 `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 解析器解析輸入。現代網頁瀏覽器使用的 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
或指定空檔案,則會產生警告。此警告不是由 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">哈囉世界!</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 | 另一個哈囉世界!
在這篇文章 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();
}