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

PHP 使用 preg_match_all 進行資料採集與處理實戰筆記:編碼轉換與正則匹配技巧

     編輯:PHP 相關知識

前言

在進行網頁資料採集時,PHP 的 preg_match_all 是提取結構化資料的利器。本文整理了從採集到清洗、匹配、去標籤的完整流程,並分享編碼轉換與正則優化的實戰經驗,幫助開發者快速構建穩健的採集腳本。

一、使用 cURL 實現跨站採集

採集的第一步是獲取目標頁面原始碼。推薦使用 cURL 庫,支援 HTTPS、Cookie、User-Agent 等完整 HTTP 特性。詳細實作可參考筆者先前文章:PHP cURL 採集基礎教學。

二、字元編碼轉換:解決亂碼根源

目標網站可能使用 GBK、Big5、UTF-8 等不同編碼。採集前務必檢視 Content-Type 或頁面 <meta charset> 確認原始編碼,再用 mb_convert_encoding() 統一轉為 UTF-8:

// 已知原編碼為 GBK
$str = mb_convert_encoding($str, 'UTF-8', 'GBK');

// 未知編碼,啟用自動偵測
$str = mb_convert_encoding($str, 'UTF-8', 'auto');

提示:若 mbstring 擴展未啟用,可改用 iconv(),但 mb_convert_encoding 對中文支援更佳。

三、預清洗:移除干擾匹配的空白字元

HTML 原始碼常含換行、Tab、多餘空格,導致正則匹配失敗。建議在匹配前統一清理:

方法一:str_replace 逐項替換(效能較好)

$contents = str_replace(["\r\n", "\n", "\t", " "], '', $contents);

方法二:正則一次清理(語法簡潔)

$contents = preg_replace('/[\r\n\t ]+/', '', $contents);

實測下,str_replace 在大型字串處理上速度快約 2-3 倍,建議優先使用。

四、核心步驟:preg_match_all 精準提取資料

preg_match_all 可一次擷取所有符合模式的片段,語法如下:

int preg_match_all(string $pattern, string $subject, array &$matches, int $flags = 0)

常用旗標:

  • PREG_PATTERN_ORDER(預設):$matches[0] 為完整匹配(含邊界),$matches[1] 為第一個捕獲組……
  • PREG_SET_ORDER:$matches[0][0] 為第一筆完整匹配,$matches[0][1] 為第一筆第一捕獲組,結構更直觀,推薦採集場景使用。
  • PREG_OFFSET_CAPTURE:回傳位移資訊,適合需定位原文位置的場景。

實戰範例:提取文章段落

// 目標:

實際內容

preg_match_all('/<p class="content">(.*?)<\/p>/s', $contents, $out, PREG_SET_ORDER); // $out[0][0] → 含標籤完整字串 // $out[0][1] → 僅捕獲組內容(即「實際內容」) // 第 n 筆資料:$out[n-1][1] // 若有多個捕獲組:$out[n-1][m] 取第 m 組

關鍵技巧:

  • 使用 s 修飾符讓 . 匹配換行,避免跨行匹配失敗。
  • 邊界標籤盡量具體(如 class="content"),減少誤匹配。
  • 若結構複雜,考慮搭配 DOMDocument 或 QueryList 等解析器,比純正則更穩健。

五、去除 HTML 標籤:取得純文字內容

提取到帶標籤的片段後,使用 PHP 內建 strip_tags() 一鍵淨化:

$cleanText = strip_tags($out[0][1]);
// 保留特定標籤(如 
, ): $cleanText = strip_tags($out[0][1], '
');

總結與最佳實踐建議

  1. 編碼優先:採集第一行就統一轉 UTF-8,避免後續亂碼連環錯。
  2. 清洗先行:移除空白字元能大幅降低正則複雜度。
  3. 善用 PREG_SET_ORDER:資料結構符合直覺,迭代處理更簡潔。
  4. 正則要「窄」不要「寬」:精確邊界、非貪婪匹配 (.*?)、加 s 修飾符。
  5. 備案方案:關鍵資料建議同時用 DOM 解析器驗證,雙重保險。

掌握這套流程,面對多數靜態頁面採集需求皆能游刃有餘。動態渲染頁面則需引入 Headless Chrome(如 Puppeteer/PHP-WebDriver)處理,另文探討。

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