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

PHP 使用 preg_match_all 批次擷取網頁圖片 URL 完整實戰與效能優化

     編輯:PHP 相關知識

PHP 使用 preg_match_all 批次擷取網頁圖片 URL 完整實戰與效能優化

爬蟲、內容遷移、圖片備份等場景常需從 HTML 大量擷取 `` 標籤的 `src` 屬性。本文示範 preg_match_all 正則寫法、捕獲組設計、多態來源處理(相對/絕對/資料 URI),並提供 DOMDocument 替代方案與效能對比建議。

正則表達式設計

$pattern = '/<img\b[^>]*\bsrc\s*=\s*["\']([^"\']+)["\'][^>]*>/i';
  • <img\b:精確匹配標籤開頭,避免誤匹 `` 等。
  • [^>]*:貪婪匹配中間屬性,不跨越標籤結束。
  • \bsrc\s*=\s*["\']:匹配 `src=` 及單雙引號包裹。
  • ([^"\']+):捕獲組 1 取得 URL 本體。
  • i 修飾符:大小寫不敏感。

完整擷取與去重範例

$html = file_get_contents('https://example.com/article/123');
$pattern = '/<img\b[^>]*\bsrc\s*=\s*["\']([^"\']+)["\'][^>]*>/i';

preg_match_all($pattern, $html, $matches);
// $matches[0] 完整標籤,$matches[1] 捕獲的 URL 陣列

$urls = array_unique($matches[1]); // 去重

// 相對路徑轉絕對
$base = 'https://example.com';
$absoluteUrls = array_map(function($u) use ($base) {
    if (strpos($u, '//') === 0) return 'https:' . $u;          // 協定相對
    if ($u[0] === '/') return $base . $u;                      // 根相對
    if (strpos($u, 'http') !== 0) return $base . '/' . $u;     // 相對路徑
    return $u;                                                 // 已為絕對
}, $urls);

print_r($absoluteUrls);

進階場景處理

場景正則調整 / 後處理
data URI (src="data:image/png;base64,...")擷取後檢測 `strpos($u, 'data:') === 0`,依需求保留或捨棄
srcset 響應式圖片另行匹配 `srcset` 屬性,解析 `url width` 描述符
Lazy-load 佔位圖 (data-src)擴展正則捕獲 `data-src`、`data-original` 等屬性
編碼實體 (&#039;、&quot;)擷取前先 html_entity_decode($html, ENT_QUOTES, 'UTF-8')

DOMDocument 替代方案(更健壯)

$dom = new DOMDocument();
libxml_use_internal_errors(true); // 抑制 HTML5 標籤警告
$dom->loadHTML($html);
libxml_clear_errors();

$xpath = new DOMXPath($dom);
$imgs  = $xpath->query('//img');

$urls = [];
foreach ($imgs as $img) {
    $src = $img->getAttribute('src');
    if ($src) $urls[] = $src;
    // 可同時抓 data-src
    $dataSrc = $img->getAttribute('data-src');
    if ($dataSrc) $urls[] = $dataSrc;
}
$urls = array_unique($urls);

效能與選型建議

維度preg_match_allDOMDocument + XPath
速度 (小型 HTML < 100KB)極快 (ms 級)稍慢 (解析樹開銷)
速度 (大型 HTML > 1MB)記憶體峰值高,易觸發 memory_limit較穩定,可配合 XMLReader 流式處理
容錯率對巢狀/殘缺/非標準 HTML 易漏匹或誤匹瀏覽器級解析器,極高容錯
維護性正則複雜難讀XPath 語意清晰,易擴充

建議:簡單單頁抓取、結構固定 → 正則;複雜/多來源/長期維護專案 → DOMDocument/XPath;超大檔/串流處理 → XMLReader 或 Masterminds/HTML5-Parser。

常見陷阱避坑

  • 貪婪匹配導致跨標籤:改用 `]+>` 或具體屬性順序限制。
  • 未處理換行/縮排:加 `s` 修飾符 (DOTALL) 或預先 `str_replace(["\r","\n","\t"], '', $html)`。
  • 編碼不一致:確認 `mb_detect_encoding` 並統一轉 UTF-8 再匹配。

掌握上述技巧,即能高效、穩健地從任意 HTML 批次擷取圖片資源,為下游下載、CDN 遷移、內容審核提供乾淨資料源。

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