網頁開發中常需「扒皮」(參考/複製)他站樣式,龐大 CSS 文件可能包含上百張背景圖、圖標等資源。手動下載效率極低,PHP 腳本可自動解析 CSS 並批量下載所有圖片。
url(...) 模式提取圖片路徑<?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(string $filename, mixed $data, int $flags = 0, resource $context = null): int|false
| 參數 | 說明 |
|---|---|
| filename | 目標文件路徑,不存在則自動創建 |
| data | 要寫入的數據(字串、陣列或流) |
| flags | FILE_USE_INCLUDE_PATH、FILE_APPEND、LOCK_EX |
| context | 流上下文選項 |
等同於 fopen() → fwrite() → fclose() 的簡寫,效能更佳。
../)、絕對路徑、帶查詢參數的 URL同理可構建: