PHP 正則提取留言內容:雙層過濾解析嵌套 HTML 結構
  編輯:PHP 綜合知識
前言
從包含嵌套結構的 HTML 字串中精準提取目標留言內容,是爬蟲、資料清洗、舊系統遷移常見需求。本文示範**雙層正則過濾**策略:第一層定位外層容器,第二層剝離內層嵌套結構,配合 `preg_match` 實現精準提取。
目標 HTML 結構分析
特徵:
- 外層容器:`id="read_數字"` + 固定 `style` 屬性
- 目標內容:外層容器直接文字節點 (「測試文字1」)
- 干擾結構:內層 `';
/*
* 第一層:匹配外層容器,捕獲其完整內部 HTML
* 模式解析:
* id="read_\d{8}" - 固定前綴 + 8位數字
* style="font-size:14px;line-height:150%;padding:10px;" - 固定樣式 (作為特徵)
* > - 結束標籤
* (.*?) - 非貪婪捕獲內部內容 (第1捕獲組)
*
- 結束標籤
* $ - 字串結尾
*/
$pattern1 = '/id="read_\d{8}"\s+style="font-size:14px;line-height:150%;padding:10px;">(.*?)<\/div>$/s';
if (preg_match($pattern1, $str, $matches)) {
echo "第一層匹配成功\n";
$inner_html = $matches[1]; // 獲得: "測試文字1
...
"
/*
* 第二層:剝離內層嵌套 div
* 以 "
(.*?)<\/div>$/s';
$result = preg_match($pattern, $str, $m)
? explode('
正則關鍵點解析
| 元素 | 說明 |
/.../s |
修飾符 s (PCRE_DOTALL):讓 `.` 匹配換行符,跨行匹配 |
(.*?) |
非貪婪匹配:盡可能少匹配,配合後續 `<\/div>$` 精準定位 |
\s+ |
匹配一或多個空白字符 (含換行、Tab),容忍格式差異 |
explode('
HTML;
$dom = new DOMDocument();
libxml_use_internal_errors(true); // 抑制 HTML5 解析警告
$dom->loadHTML('' . $html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
libxml_clear_errors();
// 1. 找到目標容器
$xpath = new DOMXPath($dom);
$container = $xpath->query('//div[@id="read_111111" and contains(@style, "font-size:14px")]')->item(0);
if ($container) {
// 2. 獲取第一個文字節點 (直接子節點中 type=XML_TEXT_NODE)
foreach ($container->childNodes as $node) {
if ($node->nodeType === XML_TEXT_NODE) {
$text = trim($node->textContent);
if ($text !== '') {
echo "DOM 提取結果: [$text]\n";
break;
}
}
}
}
/*
優點:
- 結構化查詢,不依賴字串格式
- 自動處理實體編碼、巢狀標籤、屬性順序變化
- XPath 支援複雜條件
*/
線上工具推薦
在線 HTML/JS/CSS 代碼過濾工具:
https://tools.jb51.net/code/htmlfilter
延伸閱讀
更多 PHP 相關內容可參考本站專題:《PHP 文件操作總結》、《PHP 運算與運算符用法總結》、《PHP 網絡編程技巧總結》、《PHP 基本語法入門教程》、《PHP 操作 Office 文檔技巧總結》、《PHP 日期與時間用法總結》、《PHP 面向對象程序設計入門教程》、《PHP 字符串用法總結》、《PHP+MySQL 數據庫操作入門教程》及《PHP 常見數據庫操作技巧匯總》。
- 上一篇文章: Android 微信內置瀏覽器緩存清除完整指南:隨機參數法 + Meta 標籤雙重保障
- 下一篇文章: PHP OpenSSL RSA 加密解密完整實作:金鑰生成、公私鑰加解密、簽名驗簽、Base64 安全傳輸
Copyright © 程式碼之家 All Rights Reserved
|