> 嘎嘎,小邪最近没啥新点子,强力寻找灵感中,所以只好给 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]);
}
}?>
"一日一漫画MM图" 求解释第二个字的词性,谢谢。
@第三眼 , 嘿嘿嘿,偷偷告诉你,你不要告诉别人喔,是动词呐 ~ :redface:
阅读器真好,还能保证抢沙发和板凳
@第三眼 , 囧,你人品超好的,小邪很少用阅读器抢到沙发的说 ~
都是靠 Twitter 抢 ~ :biggrin:
@邪 罗刹,
twitter如何抢?
@柳城 , 因为很多盆友会用 Twitter 新文章通知插件的~
奔图片来~~ :redface:
小邪,不用回访了。。公司被封了5台服务器。。
我的博客也在其中。。杯具。。
估计几天能恢复~~
@kaka,
纳尼,国内清理行动还在继续啊,都要过年了
@第三眼 , = =,派对觉得过年就要更加滴和谐才行 ~ ╮(╯▽╰)╭
@kaka , 杯具,小邪说怎么今天没有看到黄绿橙的更新 ~
看着上面三个魔方还真是奇怪
@Auston Jary , ╮(╯_╰)╭,你一说还真有点儿诡异 ~
这个方法真不错,但是我理解了部分!杯具!
@Joyla , 呵呵,真开心你理解了,就算是部分,也让小邪觉得花蛮长时间去写是值得的 ~
@邪 罗刹,
谢谢博主的夸奖!哈哈
@邪 罗刹,呵呵!博主抬举啦
@Joyla , 呵呵,小邪看好你呦 ~
最近你的文章都是关于图片的呢
@江流 , 恩恩,最近没什么灵感,只好从上次图床的话题还是进一步扩展鸟 ~ :confused:
1. 楼上好多魔方。。。
2. 小邪每一篇文章都离不开regex。。。
3. 你怎么每天一个图床的。。。
@路人假 , 1. 杯具,楼上特诡异 ~
2. = =,囧了,小邪自己都没发现,最近老拿 Regex 来玩 ~
3. Skydrive 有三位盆友看不到, Drop 林木木说有很严格的未知的流量限制,所以 ... ~
这个方法好,我喜欢!
ps:今天的MM露点了~你不负责任啊~
@北街 , 汗,没露呀,是不是您老YY太深入鸟 ~
@邪 罗刹,
你戴墨镜肯定看不清楚啦~
@北街 , 囧,好吧好吧,露点了露点了 ~ :redface:
@邪 罗刹,
然道你把墨镜拿掉了?别以为你戴着眼镜我就不认识你了~
@北街 , 哎呀呀,小邪被人盯住鸟,阿门 ~ 以后不能随意上街了,远离北街,珍爱生命 ~
@邪 罗刹 ,
~~
@邪 罗刹,
小样,想跑?你脱了墨镜我照样认识你~
@北街 , 把超人的小裤裤套在你头像,就看不到小邪鸟 ~
@邪 罗刹,
小邪鸟那么小么?连看都看不到了?ps:你经常用内裤套头的么~还是红滴~o(╯□╰)o
@北街 , = =,“鸟”=“了”,大妈你Out了 ~ 哇卡卡卡 ~
话说,内裤,╮(╯▽╰)╭,可怜的内裤,你死得好惨 ~
啥时候开发个WordPress主题扒皮软件就好了。O(∩_∩)O哈哈~
@漠天 , 囧,主要是WP的主题大部分文件都是PHP,扒也扒不来哇 ~
╮(╯▽╰)╭ ~
我是用Firefox的查看媒体,就可以把网页的所有资源都下载下来了。。包括CSS里的图片等~
@fatkun , 杯具,小邪在讲PHP,为什么好多盆友都要和小邪介绍FF ~
小邪只用Chrome来着,火狐用不习惯的 ~
话说Chrome的审核元素功能也可以做到这个的 ~
@邪 罗刹,
我也是用Chrome~`偶尔用用Firefox的插件~~
审查元素暂时我还用不惯。。
@fatkun , 呵呵,不好意思,刚才小邪鸡冻去鸟 ~ 别介意额 ~
原来你也是zcool的fans。我也是,这css抓图用的好可以盗站哦,呵呵
@Rusaer , 呵呵,还好,不算是Fans,十天半月去一下而已 ~
盗站也没问题,╮(╯▽╰)╭ ~
可以借来一用啦
@MM , 呵呵,很高兴对你有用呐 ~
看来你php技术进化了呵。。 :biggrin:
@QiQiBoY , 呵呵,你的 jquery 和 ajax 小邪可是望尘莫及喔 ~
嘻嘻 ~ 大家互相学习 ~
解释等于掩饰,小邪你一点也不纯洁,O(∩_∩)O哈哈~
@疾风 , 哎呀,被你发现了 ~ :redface:
折腾是生活的本质啊
@瑜际 , 呵呵,说得好,折腾才是生命 ~
这也能用PHP?你牛的小邪 :rolleyes:
@万戈 , 呵呵,还好啦 ~
话说最近小邪看万戈兄你的文章很爽 ~
感觉把WP的衣服一层一层扒下来 ~
O(∩_∩)O 哈哈~
小邪的php编程是自学的?
@freetao , 是的,小邪是金融类专业的 ~
你越来越划邪恶了
@阿吴 , 呵呵,谢谢,没有最邪恶,只有更邪恶 ~
你前面的文字都是为了引出最后那张图吧!支持,以后字越多,图越多才好!
@Kada , 汗 实际上一点儿关系也没有 ~
不过这样说也行 呵呵 ~
介绍的相当详细
@先看看 , 呵呵,谢谢支持 ~
@征途牛仔 , 嘿嘿嘿,握手握手 ~ :biggrin:
我承认我是来看美女图片连载的,哈哈。
@g , 呵呵,欢迎来看 ~ 嘻嘻 ~
感觉用来拔皮不错 :rolleyes:
@YYWR , 恩,蛮方便的说 ~
@漠岚 , 囧,这样理解也可以啦,嘎嘎 ~ :biggrin:
小"鞋"哥 弄个在线的出来啊!!!我支持!
@漠岚 , 囧,再叫小鞋,小邪就切你JJ ~
在线的吃不消呐,上次的Alex和Pr排名弄得小邪站点负载太大了 ~
嘿嘿,这个好,以后偷别人的主题更方便了。。。
@SATURN , 嘎嘎,到时候小邪要观摩你的成果喔 ~
很强大,你的PHP真牛
@bolo , 呵呵,Bolo你太谦虚了 ~
小邪才学了2个月不到 有待加强呢 :biggrin: ~
代码很实用啊。图片也很强大。
@Mars , 呵呵,谢谢支持了 ~
小邪你的文章 我实在~~不知道怎么评论呀! 都好多看不懂!
@星网 , 下次你就说 “我是来打酱油的” 也没问题的,嘻嘻 ~
HOHO,这个实用,受教了。哈哈!
@Nox , 呵呵,对你有用真让人高兴 ~ :biggrin:
我认为你最近一定很闲~
来回来去地折腾着博客啊~
@exia , 最近忙的蛋疼,还生了点小病,杯具 ~ ╮(╯▽╰)╭
想法真多 :biggrin:
@17doit , 呵呵,小邪总想写点儿什么 ~
哈 考完试了 来看看你~~
还在继续玩正则表达式哈~~ 加油加油
@Kaisir.Wang , 小邪变成正则控了,囧 ~
祝你考试成绩满分 ~
我很努力的去 研究。。。可是。。似乎还是看不太懂。。。。悲剧。。。
@mulnim , 呵呵,没事,慢慢来,小邪这里很多的是总结 ~
很早就看过博主的站了,技术人员,学习了。
@邓玮 , 呵呵,对你有用是对小邪最大的支持 ~
这个功能我倒是很想要
但是就是看不懂
@胡余丰 , ╮(╯▽╰)╭,慢慢来,挺住勇士 ~
好几天没来咯!
哎,也不知道自个在忙啥 ..
晕晕乎乎的
@619 , 不过小邪猜你应该挺充实的吧 ~
不错不错,要是能自动获得CSS代码就更好了 :biggrin:
@九站 , 囧,小邪在文中解释了为什么不加这个功能的原因了 ~
> 因为考虑到经常碰到多个 CSS 文件的状况,所以小邪没有直接填一个 CSS 路径。
> 而是把几个 CSS 文件的内容合并到一起,全部塞到 abc.css 文件里面即可,嘎嘎嘎。
@邪 罗刹,
不,这并不成为理由,可以用PHP将多个CSS内容写在一个CSS里呀。有什么不可以的。
@九站 , = =,哥蛋疼 ~
嗯,那个……
可能你研究代码花十分钟,查找这张图片半分钟。
但是我看完代码花半分钟,盯住图片十分钟。
@hodz , 没事儿,能分到半分钟到代码,小邪也是蛮高兴的 ~
很多盆友都跳着看的 ~
我只看到日本漫画MM。。。很大。。。
@苏囧 , 嘻嘻,小邪最近更加邪恶鸟 ~ ╮(╯_╰)╭
写得好详细!这功能虽然用得不多,有时会很受用,省时省力。
@Dickey , 呵呵,小邪发现你是一位爱兔之人嘛 ~
小邪小时候养过兔子,结果貌似吃错东西了,PP出问题鸟 ~ 杯具 ~
小邪的PHP折腾的很厉害啊
FF的“查看页面信息”也能抓到CSS背景。
@alswl , 知道呢,话说Chrome的审核元素也可以做到这个 ~
嘎嘎,FF真是受欢迎,不过小邪实在是不习惯 ~
每次小邪玩PHP,都有盆友和小邪介绍FF ~
我在想,要是能够将此思路实现,制成工具,傻瓜式的,那一定会流行整个互联网,兄弟,加油!
@Sawyer , 呵呵,浏览器都具备了大部分的功能呢,像Chrome的审核元素之类的 ~
所以小邪就不去操心这个了呢 ~
再来找这篇文章好难找啊!
不行,我得转走,方便以后查询!
有技术难题都来你这啦!
@菠萝 , 呵呵,谢谢你的支持 ~ 转吧转吧 ·
震惊...成功了...继续埋头看正则...
@MOPVHS , 呵呵,加油加油,小邪支持你呐 ~

代码好多,我的心好乱
@有点蓝 , 蛋定,现在经常到小邪这里来的盆友看到代码已经显得无比蛋定了 ~