萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

PHP 解析 HTML 神器:Simple HTML DOM Parser 完整使用指南

簡介

Simple HTML DOM Parser 是一個純 PHP 實現的 HTML 解析器(PHP 5.3+),支持:

  • 解析**不符合 W3C 標準**的「髒」HTML(瀏覽器容錯模式)。
  • **jQuery 風格選擇器**(ID、Class、標籤、屬性、後代、鄰接)。
  • DOM 節點**增刪改查**(屬性、inner/outer text、包裹、移除)。
  • 輸出修改後的 HTML。

項目地址:github.com/samacs/simple_html_dom

安裝

  1. Composer(推薦):composer require sunra/php-simple-html-dom-parser
  2. 或手動下載 simple_html_dom.php 放入項目 include。

三種加載 HTML 方式

require_once 'simple_html_dom.php';
$html = new simple_html_dom();

// 1. 從 URL 加載(內部用 file_get_contents,建議改用 cURL 獲取後用 load())
$html->load_file('https://www.example.com');

// 2. 從字符串加載(推薦:先用 cURL 獲取內容)
$html->load('從字符串加載');

// 3. 從本地文件加載
$html->load_file('/path/to/file.html');

查找元素:find() 選擇器大全

返回 元素對象數組,或指定索引返回單個對象(未找到返回 null)。

選擇器說明示例
標籤名所有該標籤$html->find('a')
ID 選擇器唯一元素$html->find('#container') 或 $html->find('div[id=main]', 0)
Class 選擇器所有該類$html->find('.foo')
屬性存在包含該屬性$html->find('[id]')、$html->find('div[id]')
屬性等值精確匹配$html->find('a[href="https://example.com"]')
屬性開頭/結尾/包含正則風格[href^="https"]、[src$=".jpg"]、[class*="btn-"]
多選擇器並集$html->find('a, img, script')
後代組合空格分隔$html->find('ul li')、$html->find('ul li.selected')

節點遍歷屬性(類似 jQuery 遍歷)

$e = $html->find('#main', 0);
$e->parent;           // 父元素
$e->children;         // 子元素數組
$e->children(0);      // 第一個子元素
$e->first_child();    // 同上
$e->last_child();     // 最後一個子元素
$e->prev_sibling();   // 上一個同級元素
$e->next_sibling();   // 下一個同級元素

元素四大核心屬性

屬性含義等價 jQuery
tag標籤名(小寫)prop('tagName').toLowerCase()
innertext內部 HTMLhtml()
outertext包含自身的 HTMLprop('outerHTML')
plaintext純文本(去除標籤)text()

屬性操作(讀/寫/刪/判斷)

$a = $html->find('a', 0);

// 讀取
$href = $a->href;

// 修改
$a->href = 'https://new-url.com';
$a->class = 'btn btn-primary';
$a->{'data-id'} = 123; // 包含特殊字符的屬性用大括號

// 刪除
$a->href = null;
unset($a->href); // 同效

// 判斷存在
if (isset($a->href)) { ... }

元素增刪改(通過 outertext 變通)

$e = $html->find('.target', 0);

// 1. 刪除元素
$e->outertext = '';

// 2. 替換元素
$e->outertext = '
新內容
'; // 3. 包裹元素 $e->outertext = '
' . $e->outertext . '
'; // 4. 前插入 $e->outertext = '前置' . $e->outertext; // 5. 後插入 $e->outertext = $e->outertext . '後置';

輸出修改後的 HTML

// 直接輸出整個文檔
echo $html;

// 或獲取字符串
$doc = (string)$html; // 或 $html->save()
file_put_contents('modified.html', $doc);

⚠️ 內存洩漏警告與清理(關鍵!)

Simple HTML DOM 內部構建大量對象引用循環,**PHP 垃圾回收器(GC)無法自動回收**,大量解析會導致內存耗盡。

務必在用完後調用:

$html->clear(); // 斷開引用循環,釋放內存
unset($html);   // 可選

最佳實踐: 封裝為服務類,單次請求解析多頁時,**每頁解析完立即 clear()**,或使用生成器逐頁處理。

現代替代方案對比

方案優點缺點推薦場景
Simple HTML DOMAPI 簡單、jQuery 風格、容錯強純 PHP 慢、內存洩漏需手動清理、無 XPath簡單腳本、兼容舊代碼、小規模解析
DOMDocument + DOMXPath內建、標準、支持 XPath、性能好嚴格模式難解析髒 HTML、API 繁瑣結構良好 XML/HTML、需 XPath 查詢
Masterminds/HTML5 (PHP)HTML5 標準解析器、極強容錯較慢、較新現代項目、需標準合規解析
symfony/dom-crawlerjQuery API、CSS 選擇器、集成 Symfony需 Composer、較重Symfony/Laravel 項目、測試爬蟲
copyright © 萬盛學電腦網 all rights reserved