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

PHP 批量下載 CSS 文件中的圖片資源

     編輯:PHP 綜合知識

應用場景

網頁開發中常需「扒皮」(參考/複製)他站樣式,龐大 CSS 文件可能包含上百張背景圖、圖標等資源。手動下載效率極低,PHP 腳本可自動解析 CSS 並批量下載所有圖片。

核心實現原理

  1. 讀取 CSS 文件內容(本地或遠程 URL)
  2. 正則匹配 url(...) 模式提取圖片路徑
  3. 去重後逐個下載並保存至本地

基礎版實作代碼

<?php
set_time_limit(0); // 移除執行時間限制

// 1. 獲取 CSS 內容
$styleFileContent = file_get_contents('images/style.css');

// 2. 正則提取所有 url() 路徑
preg_match_all("/url\((.*)\)/", $styleFileContent, $imagesURLArray);

// 3. 去重並下載
$imagesURLArray = array_unique($imagesURLArray[1]);
foreach ($imagesURLArray as $imagesURL) {
    // 使用 basename 獲取文件名,file_get_contents 讀取遠程內容
    file_put_contents(basename($imagesURL), file_get_contents($imagesURL));
    echo "Downloaded: " . basename($imagesURL) . "\n";
}
?>

進階封裝類:支持相對路徑轉絕對路徑

class GetInCssImage {
    /**
     * 從 CSS 提取圖片並保存本地
     * @param string $cssUrl CSS 文件 URL
     * @param string $dir 本地保存目錄
     */
    static public function saveImage($cssUrl, $dir) {
        $content = file_get_contents($cssUrl);
        
        // 正則根據實際路徑格式調整,此處針對 /images/xxx.jpg 格式
        $patterns = '/images(.*).(jpg|gif|png)/';
        preg_match_all($patterns, $content, $matches);
        $imagesUrls = $matches[0];
        
        // 創建保存目錄
        if (!is_dir($dir)) {
            mkdir(dirname(__FILE__) . '/' . $dir, 0777, true);
        }
        
        foreach ($imagesUrls as $image) {
            ob_start();
            // 補全完整圖片 URL(根據實際域名修改)
            $imageUrl = "https://www.example.com/" . $image;
            readfile($imageUrl);
            $img = ob_get_contents();
            ob_end_clean();
            
            $localImage = $dir . strchr($image, '/');
            $fp = fopen($localImage, 'wb');
            fwrite($fp, $img);
            fclose($fp);
            echo "Saved: $localImage\n";
        }
    }
}

// 使用範例
GetInCssImage::saveImage('/css/style.css', 'images/');

關鍵函數說明:file_put_contents

file_put_contents(string $filename, mixed $data, int $flags = 0, resource $context = null): int|false
參數說明
filename目標文件路徑,不存在則自動創建
data要寫入的數據(字串、陣列或流)
flagsFILE_USE_INCLUDE_PATH、FILE_APPEND、LOCK_EX
context流上下文選項

等同於 fopen() → fwrite() → fclose() 的簡寫,效能更佳。

實務優化建議

  • 異步下載:大量圖片時使用 cURL 多執行緒或 Swoole 協程加速
  • 路徑處理:妥善處理相對路徑(../)、絕對路徑、帶查詢參數的 URL
  • 斷點續傳:記錄已下載文件,避免中斷重複下載
  • 錯誤處理:捕獲 404、超時、權限錯誤並記錄日誌
  • 版權合規:僅用於學習研究,商業用途請遵守版權協議

擴展應用

同理可構建:

  • HTML 頁面圖片批量下載器
  • 網站鏡像/離線瀏覽工具
  • CDN 資源預熱腳本
  • 前端資源自動化部署流水線組件
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved