在網頁爬蟲、內容分析、資料遷移等場景中,經常需要從 HTML 原始碼中提取所有圖片的 URL。本文提供一個健壯的工具方法,支援主流圖片格式,處理單雙引號、屬性順序等變化。
方法涵蓋 20 種常見格式:.jpg、.jpeg、.png、.gif、.bmp、.svg、.webp、.tiff、.ico 等。
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 從 HTML 原始碼提取圖片 src 路徑
* @param htmlCode HTML 字串
* @return 圖片 URL 列表,無圖片時返回空列表
*/
public static List<String> getImageSrc(String htmlCode) {
List<String> imageSrcList = new ArrayList<>();
// 正則解析:
// <img\\b[^>]*\\bsrc\\b\\s*=\\s*('|")?([^'">\s]+(\.jpg|\.jpeg|\.png|\.gif|\.bmp|\.svg|\.webp|\.tiff?|\.ico|\.png|\.bmp|\.gif|\.jpg|\.jpeg|\.svg|\.webp|\.tiff?|\.ico)\\b)[^>]*>
String regex = "<img\\b[^>]*\\bsrc\\b\\s*=\\s*('|\")?([^'\">\\s]+(\\.jpg|\\.jpeg|\\.png|\\.gif|\\.bmp|\\.svg|\\.webp|\\.tiff?|\\.ico)\\b)[^>]*>";
Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(htmlCode);
while (matcher.find()) {
String quote = matcher.group(1); // 引號字元(單引號/雙引號/無)
String src = matcher.group(2); // 圖片 URL
// 處理無引號情況下可能包含的額外屬性
if (quote == null || quote.isEmpty()) {
src = src.split("\\s+")[0];
}
imageSrcList.add(src);
}
return imageSrcList;
}
| 片段 | 說明 |
|---|---|
<img\\b | 匹配 <img 標籤開頭,單字邊界避免匹配 <image |
[^>]* | 匹配任意非 > 字元(其他屬性) |
\\bsrc\\b | 精確匹配 src 屬性名 |
\\s*=\\s* | 匹配等號及前後空白 |
('|\")? | 可選的單引號或雙引號 |
([^'\">\\s]+\\.(?:jpg|jpeg|png|...)) | 捕獲組:圖片 URL(支援多種副檔名) |
[^>]*> | 匹配標籤結尾 |
String html = "<div><img src='logo.png'><img src=\\"banner.jpg\\" alt='廣告'><img src=icon.gif></div>";
List<String> images = getImageSrc(html);
// 結果:[logo.png, banner.jpg, icon.gif]
URI.resolve() 轉為絕對 URLPattern 實例複用若需提取 CSS background-image 或 data:image/... 格式,可擴展正則或改用 HTML 解析器遍歷 DOM 節點屬性。