一. 抓取CSS 中的圖片:
> 1. 先做好準備工作:
> 第一步,先把CSS 原本的路徑存到$url變數裡,然後把CSS 的內容存在abc.css 中。
> 因為考慮到經常碰到多個 CSS 檔案的狀況,所以小邪沒有直接填滿一個 CSS 路徑。
> 而是把幾個 CSS 檔案的內容合併到一起,全部塞到 abc.css 文件裡面即可,嘎嘎嘎。
$data = file_get_contents('abc.css');
> 接著讀取CSS 檔案的內容到$data 變數中,然後用正規式把域名給取出。
> 因為這裡考慮到許多圖片檔案用到了相對根路徑,比方說 /img/1.gif 和 img/1.gif。
> 然後 CSS 原始位址在 http://www.jb51.net/css/ 那麼上面的兩個檔案位置是不同的。
> 第一個檔案在 /upload/201109/20110926143903807.gif,因為它的路徑用到了相對根路徑。
> 而第二個在 /upload/201109/20110926143903169.gif,它的路徑只是普通的相對路徑。
2. 把圖片儲存資料夾建好:
> 小邪這裡用了 is_dir 來確定資料夾是否存在,存在的話,就不用再建立第二遍了。
> 呵呵,順便說下,is_file 函數可以確定此文件是否為正常文件,也可以確定是否存在。
> 但 file_exists() 優越一點,因為某次看到有人在 Webmasterworld.com 上面討論過。
if (!is_dir('img')) { mkdir('img'); }
> 3. 用正規式將圖片相對位址取出來:
#$regex = '/url\(\'{0,1}\"{0,1}(.*?)\'{0,1}\"{0,1}\)/';
//這裡用正規式配對出圖片位址,要考慮三種情況,即url(1.gif) url('1.gif') url("1.gif")。
//這三種寫法都是可以使用的,所以咱們就用上面的正規把裡面的 1.gif 取出來。
//\'{0,1} 表示單引號可能出現1次或0次,\" 則表示雙引號可能出現1次或0次。
//中間必須使用懶惰匹配,不然取出來的就是1.gif" 而不是1.gif 鳥,O(∩_∩)P。
preg_match_all($regex,$data,$result);
#> 4. 處理這些圖片:
> 先使用一個循環,上面是用正規提取出來的第一分支內容數組給處理一下。
> 額,這裡的第一個分支表示正規式裡面的第一個括號來著,呵呵,以此類推。
foreach ($result[1] as $val) { }
> 然後是用正則式判定,因為也要考慮到這樣 /upload/201109/20110926143903807.gif。
> 這樣是使用了完整的路徑了,而不是想其他的一樣是 /img/1.gif 或 img/1.gif。
> 所以單獨判斷一下,然後接著判斷這兩個,看看是 /img/1.gif 還是 img/1.gif。
<?php //URL是远程的完整图片地址,不能为空, $filename 是另存为的图片名字 //默认把图片放在以此脚本相同的目录里 function GrabImage($url, $filename=""){ //$url 为空则返回 false; if($url == ""){return false;} $ext = strrchr($url, ".");//得到图片的扩展名 if($ext != ".gif" && $ext != ".jpg" && $ext != ".bmp"){echo "格式不支持!";return false;} if($filename == ""){$filename = time()."$ext";}//以时间戳另起名 //开始捕捉 ob_start(); readfile($url); $img = ob_get_contents(); ob_end_clean(); $size = strlen($img); $fp2 = fopen($filename , "a"); fwrite($fp2, $img); fclose($fp2); return $filename; } //测试 GrabImage("http://www.php.cn/images/logo.gif", "as.gif"); ?>
ob_start : 打開輸出緩衝
This function will turn output buffering on. While output buffering is active no output is sent from the script (other than headers), instead the output is stored in n internald . (輸出是在內部緩衝儲存)
//
readfile : 讀入一個檔案並寫入到輸出緩衝
傳回從檔案讀入的位元組數。如果出錯返回 FALSE 並且除非是以 @readfile() 形式調用,否則會顯示錯誤訊息。
//
ob_get_contents : Return the contents of the output buffer(返回輸出緩衝的內容)
This will return the contents of the output buffer without clearing it or FALSE, if output buffering isn' t active. (如果輸出緩衝沒有活動(開啟),則傳回FALSE)
//
ob_end_clean() : Clean (erase) the output buffer and turn off output buffering(清除輸出緩衝) 。
以上是如何使用php採集抓取css圖片程式碼詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!