本文介紹如何使用 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 抑制警告,配合返回值判斷file_get_contents 以支援更複雜的網絡環境