在 PHP 專案中解析、操作 HTML 文件向來是個挑戰,尤其面對不符合 W3C 標準的「髒亂」 HTML 時,原生 DOMDocument 常報錯或表現不佳。Simple HTML DOM Parser 以 jQuery 風格的選擇器語法、強大的容錯能力與直觀的物件導向 API,成為 PHP 開發者處理 HTML 的首選工具。本文將從安裝、基本操作、進階選擇、元素操作到記憶體優化,完整介紹這個函式庫的實戰用法。
專案地址:GitHub Repository(需 PHP 5.0+)。下載 simple_html_dom.php 置入專案即可使用,無需 Composer 安裝。
<?php
require_once 'simple_html_dom.php';
// 建立 DOM 實例
$html = new simple_html_dom();
// 1. 從 URL 直接載入(內部使用 file_get_contents)
$html->load_file('https://example.com');
// 2. 從字串載入(建議先用 cURL 取得內容再載入)
$htmlStr = '<html><body><h1>Hello</h1></body></html>';
$html->load($htmlStr);
// 3. 從本地檔案載入
$html->load_file('/path/to/local/file.html');
?>
提示:大型頁面或需處理 Cookie/Header 時,建議使用 cURL 取得內容後再呼叫load(),避免load_file()的限制。
find() 方法支援 CSS 選擇器語法,回傳元素物件陣列(或單一元素):
<?php
// 所有錨點
$links = $html->find('a');
// 第 N 個錨點(索引從 0 開始),找不到回傳 null
$firstLink = $html->find('a', 0);
// ID 選擇器
$mainDiv = $html->find('#main', 0);
// Class 選擇器
$items = $html->find('.item');
// 屬性選擇器
$withId = $html->find('[id]');
$specificAttr = $html->find('div[data-role="page"]');
// 後代選擇器
$listItems = $html->find('ul li');
$selectedItems = $html->find('ul li.selected');
// 群組選擇器
$media = $html->find('img, video, audio');
?>
每個元素物件內建屬性可直接存取關聯節點:
<?php
$element = $html->find('#container', 0);
$parent = $element->parent; // 父元素
$children = $element->children; // 所有子元素陣列
$firstChild = $element->first_child(); // 第一個子元素
$lastChild = $element->last_child(); // 最後一個子元素
$prev = $element->prev_sibling(); // 上一個鄰近元素
$next = $element->next_sibling(); // 下一個鄰近元素
?>
<?php
$a = $html->find('a', 0);
// 存取屬性(物件屬性方式)
$href = $a->href;
$title = $a->title;
// 四大核心屬性
echo $a->tag; // 標籤名:'a'
echo $a->innertext; // 內部 HTML
echo $a->outertext; // 完整 HTML(含自身標籤)
echo $a->plaintext; // 純文字內容(去除標籤)
?>
<?php
$a->href = 'https://new-url.com'; // 修改
$a->target = '_blank'; // 新增
$a->rel = null; // 刪除(設為 null)
// 檢查屬性是否存在
if (isset($a->href)) { /* ... */ }
?>
函式庫無專門的 append()/remove() 方法,但可透過 outertext 實現:
<?php
// 包裹元素
$e->outertext = '<div class="wrapper">' . $e->outertext . '</div>';
// 刪除元素
$e->outertext = '';
// 在元素後插入新內容
$e->outertext .= '<span>新增內容</span>';
// 在元素前插入新內容
$e->outertext = '<span>前置內容</span>' . $e->outertext;
?>
<?php
// 直接輸出完整 HTML
echo $html;
// 或儲存至檔案
file_put_contents('output.html', $html);
?>
clear()Simple HTML DOM 解析大量/大型 HTML 文件時會佔用大量記憶體,且 PHP 的垃圾回收機制無法自動釋放循環引用的 DOM 物件。務必在處理完畢後呼叫 clear():
<?php
$html = new simple_html_dom();
$html->load_file('large_page.html');
// ... 處理邏輯 ...
// 釋放記憶體,斷開循環引用
$html->clear();
unset($html);
?>
最佳實踐:批次處理多個頁面時,每處理完一個頁面立即呼叫 clear(),避免記憶體累積導致腳本中止。
mb_convert_encoding() 轉碼,或確保來源頁面正確宣告 charset。find() 找不到元素回傳空陣列或 null,使用前請先檢查 if ($result)。outertext 後,原物件引用可能失效,需重新 find() 取得新物件。Simple HTML DOM Parser 以直觀的 API 與強大的選擇器,大幅降低 PHP 解析 HTML 的門檻。掌握其核心用法並養成 clear() 習慣,即可高效完成爬蟲、內容提取、HTML 清洗等任務。對於極大型文件或高效能需求,可考慮搭配 DOMDocument + XPath 或 Masterminds/HTML5-PHP 等現代替代方案。