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

PHP 正則表達式提取網頁所有圖片網址完整攻略

     編輯:PHP 相關知識

PHP 正則表達式提取網頁所有圖片網址完整攻略

爬蟲、內容遷移或編輯器圖片管理常需從 HTML 字串中提取圖片 URL。本文提供多種正則模式、實際測試案例與進階處理技巧,解決相對路徑、轉義字元、多屬性順序等實務問題。

基礎模式:針對 img src 屬性

<?php
$pattern = '/<img.*?src\s*=\s*["\']?\s*([^>"\'\s]+)/i';
preg_match_all($pattern, $html, $matches);
$imageUrls = $matches[1]; // 索引 1 為捕獲群組
?>

關鍵點:非貪婪匹配 .*?、允許單雙引號或無引號、捕獲群組只取 URL 部分。

進階模式:限定副檔名並支援 href/src

<?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.jpgHTML 使用相對路徑搭配 parse_url 取得基底 URL 組合成絕對路徑
data:image/base64 內嵌圖片src 為 base64 資料正則加入排除 data: 前綴,或事後過濾
圖片標籤跨行、屬性順序不固定HTML 格式化不一致使用 s 修飾符讓 . 匹配換行,屬性順序用非捕獲群組處理

進階:提取第 N 張圖片作為縮圖

<?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);
?>

替代方案:DOMDocument 解析器

正則處理 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; }
?>

延伸閱讀

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