需要從導航頁 HTML 結構化提取資料寫入資料庫?正則表達式雖能匹配,但維護成本高、可讀性差。PHP 內建 DOMDocument 與 DOMXPath 提供標準化 DOM 樹操作,讓伺服器端像瀏覽器端 JS 一樣優雅處理 HTML。
<?php
// 1. 載入 HTML 檔案
$dom = new DOMDocument();
libxml_use_internal_errors(true); // 抑制 HTML5 非標準標籤警告
$dom->loadHTMLFile('./hao.html');
libxml_clear_errors();
// 2. 建立 XPath 查詢器
$xpath = new DOMXPath($dom);
// 3. 精準定位目標節點
$dls = $xpath->query('//dl[@class="fix"]');
// 4. 遍歷輸出文字內容
foreach ($dls as $dl) {
foreach ($dl->childNodes as $span) {
echo trim($span->textContent) . "\t";
}
echo "\n";
}
?>
DOMDocument 預設編碼為 Latin-1,直接載入 UTF-8 含中文頁面會導致亂碼。解決方案:
<?php
$html = file_get_contents('./hao.html');
// 強制宣告 UTF-8,配合 meta 標籤或 HTTP header
$dom->loadHTML('<meta charset="UTF-8">' . $html);
// 或使用 mb_convert_encoding 預處理
?>
⚠️ 必須在 loadHTML() 之前完成編碼宣告,事後補充無效。
| 需求 | XPath 表達式 |
|---|---|
| 所有擁有 id 屬性的元素 | //*[@id] |
| 特定 id 直屬下的節點資料 | /html/body/div[@id='target'] |
| 任意層級下符合 id 的 div | //div[@id='target'] |
| class 包含特定值(需配合 contains) | //*[contains(@class, 'fix')] |
掌握 DOMDocument + DOMXPath 組合,讓 PHP 也能輕鬆玩轉 DOM 樹,告別脆弱的正則解析時代。