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

PHP 解析 CSS 文件提取圖片並自動下載保存

     編輯:PHP 相關知識

功能概述

本文介紹如何使用 PHP 遠程獲取 CSS 文件內容,利用正則表達式提取其中的圖片 URL,並自動下載保存到本地目錄。適用於前端資源遷移、靜態資源備份等場景。

核心類實現

/**
 * CSS 圖片提取與下載類
 */
class CssImageDownloader
{
    /**
     * 從 CSS 獲取圖片並保存到本地
     * @param string $cssUrl CSS 文件完整 URL
     * @param string $saveDir 本地保存目錄(相對路徑)
     * @return void
     */
    public static function saveImages(string $cssUrl, string $saveDir): void
    {
        // 1. 獲取 CSS 內容
        $content = file_get_contents($cssUrl);
        if ($content === false) {
            throw new RuntimeException("無法獲取 CSS 文件:$cssUrl");
        }

        // 2. 正則提取圖片路徑(支援 jpg/gif/png)
        // 注意:實際項目中需根據具體 CSS 路徑格式調整正則
        $pattern = '/url\([\'"]?([^\'")]+\.(?:jpg|gif|png))[\'"]?\)/i';
        preg_match_all($pattern, $content, $matches);
        $imagePaths = $matches[1] ?? [];

        if (empty($imagePaths)) {
            echo "未在 CSS 中發現圖片引用\n";
            return;
        }

        // 3. 確保保存目錄存在
        $baseDir = __DIR__ . '/' . $saveDir;
        if (!is_dir($baseDir)) {
            mkdir($baseDir, 0755, true);
        }

        // 4. 遍歷下載
        foreach ($imagePaths as $relPath) {
            // 處理相對/絕對路徑
            $imageUrl = self::resolveUrl($cssUrl, $relPath);
            $localPath = $baseDir . '/' . basename($relPath);

            // 避免重複下載
            if (file_exists($localPath)) {
                echo "已存在:$localPath\n";
                continue;
            }

            $imgData = @file_get_contents($imageUrl);
            if ($imgData !== false) {
                file_put_contents($localPath, $imgData);
                echo "下載成功:$localPath\n";
            } else {
                echo "下載失敗:$imageUrl\n";
            }
        }
    }

    /**
     * 解析相對 URL 為絕對 URL
     */
    private static function resolveUrl(string $baseUrl, string $relPath): string
    {
        if (strpos($relPath, 'http') === 0 || strpos($relPath, '//') === 0) {
            return strpos($relPath, '//') === 0 ? 'https:' . $relPath : $relPath;
        }
        $baseInfo = parse_url($baseUrl);
        $basePath = rtrim(dirname($baseInfo['path']), '/');
        return "{$baseInfo['scheme']}://{$baseInfo['host']}$basePath/$relPath";
    }
}

// 使用示例
CssImageDownloader::saveImages('https://example.com/css/style.css', 'images');

關鍵點解析

  • 正則表達式:/url\([\'"]?([^\'")]+\.(?:jpg|gif|png))[\'"]?\)/i 可匹配 url("img.png")、url(img.jpg) 等多種寫法
  • 路徑解析:resolveUrl() 自動處理相對路徑、協議相對路徑(//...)與絕對路徑
  • 錯誤處理:使用 @file_get_contents 抑制警告,配合返回值判斷
  • 去重機制:檢查本地文件是否存在,避免重複下載

擴展建議

  1. 支援更多圖片格式
  2. 加入 cURL 替代 file_get_contents 以支援更複雜的網絡環境
  3. 實現並發下載提升效率
  4. 記錄下載日誌與失敗重試機制
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved