抓取并下载CSS中所有图片文件的php代码


Posted in PHP onSeptember 26, 2011

这篇文章的亮点是,正则式更加复杂鸟,?(-_-)?,再就是 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 原地址在 https://3water.com/css/ 那么上面的两个文件位置是不同的。

> 第一个文件在 /upload/201109/20110926143903807.gif,因为它的路径用到了相对根路径。
> 而第二个在 /upload/201109/20110926143903169.gif,它的路径只是普通的相对路径。

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

抓取并下载CSS中所有图片文件的php代码
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。

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 = 'https://3water.com/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]); 
} 
}?>
PHP 相关文章推荐
如何在PHP中使用Oracle数据库(1)
Oct 09 PHP
PHP日期处理函数 整型日期格式
Jan 12 PHP
浅谈apache和nginx的rewrite的区别
Feb 22 PHP
完美解决:Apache启动问题―(OS 10022)提供了一个无效的参数
Jun 08 PHP
利用yahoo汇率接口实现实时汇率转换示例 汇率转换器
Jan 14 PHP
smarty简单分页的实现方法
Oct 27 PHP
php通过rmdir删除目录的简单用法
Mar 18 PHP
PHP整合七牛实现上传文件
Jul 03 PHP
PHP中文竖排转换实现方法
Oct 23 PHP
php上传excel表格并获取数据
Apr 27 PHP
laravel 获取当前url的别名方法
Oct 11 PHP
关于PHP5.6+版本“No input file specified”问题的解决
Dec 11 PHP
新浪微博API开发简介之用户授权(PHP基础篇)
Sep 25 #PHP
PHP+MYSQL会员系统的登陆即权限判断实现代码
Sep 23 #PHP
PHP将DateTime对象转化为友好时间显示的实现代码
Sep 20 #PHP
php方法调用模式与函数调用模式简例
Sep 20 #PHP
php若干单维数组遍历方法的比较
Sep 20 #PHP
PHP学习笔记 用户注册模块用户类以及验证码类
Sep 20 #PHP
PHP无刷新上传文件实现代码
Sep 19 #PHP
You might like
PHP的SQL注入过程分析
2012/01/06 PHP
PHP实现的线索二叉树及二叉树遍历方法详解
2016/04/25 PHP
PHP 用session与gd库实现简单验证码生成与验证的类方法
2016/11/15 PHP
php实现的后台表格分页功能示例
2017/10/23 PHP
PHP递归遍历文件夹去除注释并压缩php源代码的方法示例
2018/05/23 PHP
yii2实现Ueditor百度编辑器的示例代码
2018/11/02 PHP
类似GMAIL的Ajax信息反馈显示
2010/02/16 Javascript
50款非常棒的 jQuery 插件分享
2012/03/29 Javascript
js 获取屏幕各种宽高的方法(浏览器兼容)
2013/05/15 Javascript
jQuery选择器源码解读(五):tokenize的解析过程
2015/03/31 Javascript
js中遍历Map对象的简单实例
2016/08/08 Javascript
微信 java 实现js-sdk 图片上传下载完整流程
2016/10/21 Javascript
JS实现点击表头表格自动排序(含数字、字符串、日期)
2017/01/22 Javascript
Angular4编程之表单响应功能示例
2017/12/13 Javascript
vue自定义js图片碎片轮播图切换效果的实现代码
2019/04/28 Javascript
如何使用proxy实现一个简单完整的MVVM库的示例代码
2019/09/17 Javascript
从零搭一个自用的前端脚手架的方法步骤
2019/09/23 Javascript
jQuery实现手风琴效果(蒙版)
2020/01/11 jQuery
基于vuex实现购物车功能
2021/01/10 Vue.js
python django 访问静态文件出现404或500错误
2017/01/20 Python
python安装Scrapy图文教程
2017/08/14 Python
Python类的继承和多态代码详解
2017/12/27 Python
python实现百万答题自动百度搜索答案
2018/01/16 Python
在python中只选取列表中某一纵列的方法
2018/11/28 Python
python获取微信企业号打卡数据并生成windows计划任务
2019/04/30 Python
使用python将excel数据导入数据库过程详解
2019/08/27 Python
python中有关时间日期格式转换问题
2019/12/25 Python
Python实现画图软件功能方法详解
2020/07/28 Python
中学教师实习自我鉴定
2013/09/28 职场文书
一位农村小子的自荐信
2014/04/07 职场文书
护士优质服务演讲稿
2014/08/26 职场文书
办公室班子四风问题对照检查材料
2014/10/04 职场文书
2014年幼儿园工作总结
2014/11/10 职场文书
评职称个人总结
2015/03/05 职场文书
材料采购员岗位职责
2015/04/03 职场文书
文艺委员竞选稿
2015/11/19 职场文书