抓取并下载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 遍历XP文件夹下所有文件
Nov 27 PHP
php中实现记住密码自动登录的代码
Mar 02 PHP
解析数组非数字键名引号的必要性
Aug 09 PHP
CentOS安装php v8js教程
Feb 26 PHP
PHP获取文件夹内文件数的方法
Mar 12 PHP
PHP7正式版测试,性能惊艳!
Dec 08 PHP
Zend Framework教程之Application和Bootstrap用法详解
Mar 10 PHP
php 解决扫描二维码下载跳转问题
Jan 13 PHP
Laravel 实现Controller向blade前台模板赋值的四种方式小结
Oct 22 PHP
在phpstudy集成环境下的nginx服务器下配置url重写
Dec 02 PHP
laravel通用化的CURD的实现
Dec 13 PHP
PHP开发api接口安全验证操作实例详解
Mar 26 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
用libTemplate实现静态网页的生成
2006/10/09 PHP
简单采集了yahoo的一些数据
2007/02/14 PHP
PHP获取用户的浏览器与操作系统信息的代码
2012/09/04 PHP
php从完整文件路径中分离文件目录和文件名的方法
2015/03/13 PHP
php面向对象值单例模式
2016/05/03 PHP
php中__toString()方法用法示例
2016/12/07 PHP
父页面显示遮罩层弹出半透明状态的dialog
2014/03/04 Javascript
jquery获取颜色在ie和ff下的区别示例介绍
2014/03/28 Javascript
js获取隐藏元素宽高的实现方法
2016/05/19 Javascript
移动端jQuery修正Web页面滑动时div问题的两则实例
2016/05/30 Javascript
JavaScript使用Range调色及透明度实例
2016/09/25 Javascript
Javascript 实现微信分享(QQ、朋友圈、分享给朋友)
2016/10/21 Javascript
基于构造函数的五种继承方法小结
2017/07/27 Javascript
在Js页面通过POST传递参数跳转到新页面详解
2017/08/25 Javascript
用JS编写一个函数,返回数组中重复出现过的元素(实例)
2017/09/14 Javascript
vue-router路由与页面间导航实例解析
2017/11/07 Javascript
Express本地测试HTTPS的示例代码
2018/06/06 Javascript
详解JavaScript事件循环机制
2018/09/07 Javascript
解决angular双向绑定无效果,ng-model不能正常显示的问题
2018/10/02 Javascript
一秒学会微信小程序制作table表格
2019/02/14 Javascript
修改layui的后台模板的左侧导航栏可以伸缩的方法
2019/09/10 Javascript
Python中pip安装非PyPI官网第三方库的方法
2015/06/02 Python
Django的分页器实例(paginator)
2017/12/01 Python
python环形单链表的约瑟夫问题详解
2018/09/27 Python
Python小工具之消耗系统指定大小内存的方法
2018/12/03 Python
python在回调函数中获取返回值的方法
2019/02/22 Python
Python实现获取系统临时目录及临时文件的方法示例
2019/06/26 Python
Python绘制热力图示例
2019/09/27 Python
Shopty西班牙:缝纫机在线销售
2018/01/26 全球购物
Penhaligon’s英国官网:成立于1870年的英国香水制造商
2021/02/18 全球购物
物流管理毕业生自荐信
2013/10/24 职场文书
参观监狱心得体会
2014/01/02 职场文书
2015年电话客服工作总结
2015/05/18 职场文书
2015小学语文教师个人工作总结
2015/05/20 职场文书
用python删除文件夹中的重复图片(图片去重)
2021/05/12 Python
Win11怎么添加用户?Win11添加用户账户的方法
2022/07/15 数码科技