邪罗刹的菠萝阁


> 嘎嘎,小邪最近没啥新点子,强力寻找灵感中,所以只好给 PHP 随便找点儿事情做鸟 ╮(╯▽╰)╭。
> 今天就让 PHP 用正则式把 CSS 文件中的所有图片文件,都从 CSS 原来的位置下载来吧。

> 这篇文章的亮点是,正则式更加复杂鸟,╮(-_-)╭,再就是 Copy 函数的灰常强大的一个用法。
> 话说刚才听 NsYta 说小邪的主题太白了,杯具。最近太忙,没有空,不然就自己搞一个新主题。

一. 抓取 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.evlos.org/css/ 那么上面的两个文件位置是不同的。

> 第一个文件在 http://www.evlos.org/img/1.gif,因为它的路径用到了相对根路径。
> 而第二个在 http://www.evlos.org/css/img/1.gif,它的路径只是普通的相对路径。

$url = 'http://www.zcool.com.cn/css/';
preg_match('/(.*\/\/.*?)\//',$url,$host);
//这里用正则式把 http://www.zcool.com.cn/ 给取出来,后端不要忘记加斜杠喔。
//.*? 是懒惰匹配,也就是能匹配得越少就匹配越少的内容,这样就不会取过头了。
$host = $host[1];

> 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) {  }

> 然后是用正则式判定,因为还要考虑到这样 http://www.evlos.org/img/1.gif。
> 这样是使用了完整的路径了,而不是想其他的一样是 /img/1.gif 或者 img/1.gif。
> 所以单独判断一下,然后接着判断这两个,看看是 /img/1.gif 还是 img/1.gif。

if (preg_match('/^http.*/',$val)) { $target = $val; }
	else if (preg_match('/^\/.*/',$val)) { $target=$host.$val; }
		else { $target=$url.$val; }
echo $target."<br/>\r\n";

> 最后把文件名取出来,即 /img/1.gif 中的 1.gif,用于保存文件。

preg_match('/.*\/(.*\.\D+)$/',$val,$name);

> 然后咱们就可以开始下载了,这里要介绍一个强大的 Copy 函数用法。

if (!is_file('./img/'.$name[1])) {
	$imgc = file_get_contents($target);
	$handle = fopen('./img/'.$name[1],'w+');
	fwrite($handle,$imgc);
	fclose($handle);
}

> 上面那个是咱们的老方法了,嘎嘎,很麻烦。某次,小邪突然发现 Copy 的强大。
> Copy 居然也可以下载,所以可以轻松使用下面的代码来处理,上面的可以退休鸟。

if (!is_file('./img/'.$name[1])) {
	copy($target,'./img/'.$name[1]);
}

> 5. 完整源代码:

> 使用的时候把 $url 填好即可,然后把所有 CSS 内容存到 abc.css 中即可。

<?php
$url = 'http://www.zcool.com.cn/css/';
$data = file_get_contents('abc.css');
preg_match('/(.*\/\/.*?)\//',$url,$host);
$host = $host[1];
if (!is_dir('img')) { mkdir('img'); }
$regex = '/url\(\'{0,1}\"{0,1}(.*?)\'{0,1}\"{0,1}\)/';
preg_match_all($regex,$data,$result);
foreach ($result[1] as $val) {
	if (preg_match('/^http.*/',$val)) { $target = $val; }
		else if (preg_match('/^\/.*/',$val)) { $target=$host.$val; }
			else { $target=$url.$val; }
	echo $target."<br/>\r\n";
	preg_match('/.*\/(.*\.\D+)$/',$val,$name);
	if (!is_file('./img/'.$name[1])) {
		copy($target,'./img/'.$name[1]);
	}
}?>
Leave a comment
112 Comments.
  1. 第三眼 Mozilla Firefox Windows 坐沙发!#1

    "一日一漫画MM图" 求解释第二个字的词性,谢谢。 :mrgreen:

    @
  2. 第三眼 Mozilla Firefox Windows 坐板凳!#2

    阅读器真好,还能保证抢沙发和板凳

    @
  3. kaka Mozilla Firefox Windows 躺地板!#3

    奔图片来~~ :redface:
    小邪,不用回访了。。公司被封了5台服务器。。
    我的博客也在其中。。杯具。。
    估计几天能恢复~~

    @
  4. Auston Jary Google Chrome Windows 天花板!#4

    看着上面三个魔方还真是奇怪 :mad:

    @
  5. Joyla Internet Explorer Windows 下水道!#5

    这个方法真不错,但是我理解了部分!杯具!

    @
  6. 江流 Internet Explorer Windows 地心!#6

    最近你的文章都是关于图片的呢

    @
  7. 1. 楼上好多魔方。。。
    2. 小邪每一篇文章都离不开regex。。。
    3. 你怎么每天一个图床的。。。

    @
    • @路人假 , 1. 杯具,楼上特诡异 ~
      2. = =,囧了,小邪自己都没发现,最近老拿 Regex 来玩 ~
      3. Skydrive 有三位盆友看不到, Drop 林木木说有很严格的未知的流量限制,所以 ... ~

      @
  8. 这个方法好,我喜欢!
    ps:今天的MM露点了~你不负责任啊~ :mrgreen:

    @
  9. 啥时候开发个WordPress主题扒皮软件就好了。O(∩_∩)O哈哈~

    @
  10. 我是用Firefox的查看媒体,就可以把网页的所有资源都下载下来了。。包括CSS里的图片等~

    @
  11. 原来你也是zcool的fans。我也是,这css抓图用的好可以盗站哦,呵呵

    @
  12. 可以借来一用啦

    @
  13. 看来你php技术进化了呵。。 :biggrin:

    @
  14. 解释等于掩饰,小邪你一点也不纯洁,O(∩_∩)O哈哈~

    @
  15. 折腾是生活的本质啊

    @
  16. 这也能用PHP?你牛的小邪 :rolleyes:

    @
    • @万戈 , 呵呵,还好啦 ~
      话说最近小邪看万戈兄你的文章很爽 ~
      感觉把WP的衣服一层一层扒下来 ~
      O(∩_∩)O 哈哈~

      @
  17. 小邪的php编程是自学的?

    @
  18. 你越来越划邪恶了

    @
  19. 你前面的文字都是为了引出最后那张图吧!支持,以后字越多,图越多才好!

    @
  20. 介绍的相当详细

    @
  21. :mrgreen: 内容稍有不懂!但美女还是看的明白的 ! :biggrin:

    @
  22. 我承认我是来看美女图片连载的,哈哈。

    @
  23. 感觉用来拔皮不错 :rolleyes:

    @
  24. :mrgreen: 额 这个好!!!貌似可以整站下载拉.. 哈哈哈哈(淫笑ing)

    @
  25. 小"鞋"哥 弄个在线的出来啊!!!我支持!

    @
    • @漠岚 , 囧,再叫小鞋,小邪就切你JJ ~
      在线的吃不消呐,上次的Alex和Pr排名弄得小邪站点负载太大了 ~

      @
  26. 嘿嘿,这个好,以后偷别人的主题更方便了。。。 :cool:

    @
  27. 很强大,你的PHP真牛

    @
  28. 代码很实用啊。图片也很强大。 :mrgreen:

    @
  29. 小邪你的文章 我实在~~不知道怎么评论呀! 都好多看不懂! :cry:

    @
  30. HOHO,这个实用,受教了。哈哈! :mrgreen:

    @
  31. 我认为你最近一定很闲~
    来回来去地折腾着博客啊~

    @
  32. 想法真多 :biggrin:

    @
  33. 哈 考完试了 来看看你~~
    还在继续玩正则表达式哈~~ 加油加油

    @
  34. 我很努力的去 研究。。。可是。。似乎还是看不太懂。。。。悲剧。。。

    @
  35. 很早就看过博主的站了,技术人员,学习了。

    @
  36. 这个功能我倒是很想要
    但是就是看不懂

    @
  37. 好几天没来咯!
    哎,也不知道自个在忙啥 ..
    晕晕乎乎的 :sad:

    @
  38. 不错不错,要是能自动获得CSS代码就更好了 :biggrin:

    @
    • @九站 , 囧,小邪在文中解释了为什么不加这个功能的原因了 ~
      > 因为考虑到经常碰到多个 CSS 文件的状况,所以小邪没有直接填一个 CSS 路径。
      > 而是把几个 CSS 文件的内容合并到一起,全部塞到 abc.css 文件里面即可,嘎嘎嘎。

      @
    • @九站 , = =,哥蛋疼 ~ :cry:

      @
  39. 嗯,那个……
    可能你研究代码花十分钟,查找这张图片半分钟。
    但是我看完代码花半分钟,盯住图片十分钟。

    @
  40. 我只看到日本漫画MM。。。很大。。。

    @
  41. 写得好详细!这功能虽然用得不多,有时会很受用,省时省力。

    @
    • @Dickey , 呵呵,小邪发现你是一位爱兔之人嘛 ~
      小邪小时候养过兔子,结果貌似吃错东西了,PP出问题鸟 ~ 杯具 ~ :cry:

      @
  42. 小邪的PHP折腾的很厉害啊
    FF的“查看页面信息”也能抓到CSS背景。

    @
    • @alswl , 知道呢,话说Chrome的审核元素也可以做到这个 ~
      嘎嘎,FF真是受欢迎,不过小邪实在是不习惯 ~
      每次小邪玩PHP,都有盆友和小邪介绍FF ~

      @
  43. 我在想,要是能够将此思路实现,制成工具,傻瓜式的,那一定会流行整个互联网,兄弟,加油!

    @
    • @Sawyer , 呵呵,浏览器都具备了大部分的功能呢,像Chrome的审核元素之类的 ~
      所以小邪就不去操心这个了呢 ~

      @
  44. 再来找这篇文章好难找啊!
    不行,我得转走,方便以后查询!

    有技术难题都来你这啦!

    @
  45. 震惊...成功了...继续埋头看正则...

    @
  46. 代码好多,我的心好乱 :cry:

    @

Leave a Reply


[ Ctrl + Enter ]