首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

Simple HTML DOM Parser 完整指南:PHP 解析 HTML 的利器

     編輯:PHP 相關知識

在 PHP 專案中解析、操作 HTML 文件向來是個挑戰,尤其面對不符合 W3C 標準的「髒亂」 HTML 時,原生 DOMDocument 常報錯或表現不佳。Simple HTML DOM Parser 以 jQuery 風格的選擇器語法、強大的容錯能力與直觀的物件導向 API,成為 PHP 開發者處理 HTML 的首選工具。本文將從安裝、基本操作、進階選擇、元素操作到記憶體優化,完整介紹這個函式庫的實戰用法。

安裝與基本載入

專案地址:GitHub Repository(需 PHP 5.0+)。下載 simple_html_dom.php 置入專案即可使用,無需 Composer 安裝。

三種載入 HTML 來源的方式

<?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() 的限制。

元素查找:jQuery 風格選擇器

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

DOM 遍歷:父、子、鄰近節點

每個元素物件內建屬性可直接存取關聯節點:

<?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(),避免記憶體累積導致腳本中止。

常見陷阱與對策

  • 編碼問題:載入非 UTF-8 頁面前,先用 mb_convert_encoding() 轉碼,或確保來源頁面正確宣告 charset。
  • 無效選擇器:find() 找不到元素回傳空陣列或 null,使用前請先檢查 if ($result)。
  • 巢狀結構修改失效:修改 outertext 後,原物件引用可能失效,需重新 find() 取得新物件。

結語

Simple HTML DOM Parser 以直觀的 API 與強大的選擇器,大幅降低 PHP 解析 HTML 的門檻。掌握其核心用法並養成 clear() 習慣,即可高效完成爬蟲、內容提取、HTML 清洗等任務。對於極大型文件或高效能需求,可考慮搭配 DOMDocument + XPath 或 Masterminds/HTML5-PHP 等現代替代方案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved