爬蟲、內容遷移或編輯器圖片管理常需從 HTML 字串中提取圖片 URL。本文提供多種正則模式、實際測試案例與進階處理技巧,解決相對路徑、轉義字元、多屬性順序等實務問題。
<?php $pattern = '/<img.*?src\s*=\s*["\']?\s*([^>"\'\s]+)/i'; preg_match_all($pattern, $html, $matches); $imageUrls = $matches[1]; // 索引 1 為捕獲群組 ?>
關鍵點:非貪婪匹配 .*?、允許單雙引號或無引號、捕獲群組只取 URL 部分。
<?php $ext = 'gif|jpg|jpeg|bmp|png|webp'; $pattern = "/(href|src)=[\"']?([^\"'>]+\\.($ext))[\"']?/i"; preg_match_all($pattern, $html, $matches); // $matches[2] 為完整 URL,$matches[3] 為副檔名 ?>
<?php
$html = '<p><img title="測試" src="https://example.com/img/photo.jpg" /></p>
<p><img src=\'https://example.com/img/banner.png\' /></p>
<a href="https://example.com/img/logo.gif">連結</a>';
$ext = 'gif|jpg|jpeg|bmp|png';
preg_match_all("/(href|src)=[\"']?([^\"'>]+\\.($ext))[\"']?/i", $html, $m);
print_r($m[2]);
/* 輸出:
Array
(
[0] => https://example.com/img/photo.jpg
[1] => https://example.com/img/banner.png
[2] => https://example.com/img/logo.gif
)
*/
?>
| 問題 | 原因 | 解決方法 |
|---|---|---|
抓到轉義斜線 \/ | JSON 或 JS 字串內嵌 HTML | 先 str_replace('\\', '', $html) 移除轉義 |
相對路徑 /images/a.jpg | HTML 使用相對路徑 | 搭配 parse_url 取得基底 URL 組合成絕對路徑 |
| data:image/base64 內嵌圖片 | src 為 base64 資料 | 正則加入排除 data: 前綴,或事後過濾 |
| 圖片標籤跨行、屬性順序不固定 | HTML 格式化不一致 | 使用 s 修飾符讓 . 匹配換行,屬性順序用非捕獲群組處理 |
<?php
function getNthImage($html, $n = 0) {
preg_match_all('/<img.*?src\s*=\s*["\']?\s*([^>"\'\s]+)/i', $html, $m);
return isset($m[1][$n]) ? $m[1][$n] : null;
}
// 取第 1 張(索引 0)
$thumb = getNthImage($content, 0);
?>
正則處理 HTML 具脆弱性,建議正式專案改用 DOMDocument + DOMXPath:
<?php
$dom = new DOMDocument();
@$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$imgs = $xpath->query('//img/@src');
foreach ($imgs as $attr) { echo $attr->value . PHP_EOL; }
?>