爬蟲、內容遷移、圖片備份等場景常需從 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` 等屬性 |
編碼實體 ('、") | 擷取前先 html_entity_decode($html, ENT_QUOTES, 'UTF-8') |
$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_all | DOMDocument + XPath |
|---|---|---|
| 速度 (小型 HTML < 100KB) | 極快 (ms 級) | 稍慢 (解析樹開銷) |
| 速度 (大型 HTML > 1MB) | 記憶體峰值高,易觸發 memory_limit | 較穩定,可配合 XMLReader 流式處理 |
| 容錯率 | 對巢狀/殘缺/非標準 HTML 易漏匹或誤匹 | 瀏覽器級解析器,極高容錯 |
| 維護性 | 正則複雜難讀 | XPath 語意清晰,易擴充 |
建議:簡單單頁抓取、結構固定 → 正則;複雜/多來源/長期維護專案 → DOMDocument/XPath;超大檔/串流處理 →
XMLReader或Masterminds/HTML5-Parser。
str_replace(["\r","\n","\t"], '', $html)`。掌握上述技巧,即能高效、穩健地從任意 HTML 批次擷取圖片資源,為下游下載、CDN 遷移、內容審核提供乾淨資料源。