抓取并下载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模板引擎SMARTY
Oct 09 PHP
php中看实例学正则表达式
Dec 25 PHP
相对路径转化成绝对路径
Apr 10 PHP
火车采集器 免费版使出收费版本功能实现原理
Sep 17 PHP
色色整理的PHP面试题集锦
Mar 08 PHP
php控制linux服务器常用功能 关机 重启 开新站点等
Sep 05 PHP
DOM XPATH获取img src值的query
Sep 23 PHP
php版本的cron定时任务执行器使用实例
Aug 19 PHP
php生成curl命令行的方法
Dec 14 PHP
php实现当前页面点击下载文件的简单方法
Sep 22 PHP
PHP判断访客是否手机端(移动端浏览器)访问的方法总结【4种方法】
Mar 27 PHP
关于laravel框架中的常用目录路径函数
Oct 23 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
10条PHP编程习惯助你找工作
2008/09/29 PHP
php文件打包 下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件
2012/06/13 PHP
PHP经典面试题集锦
2015/03/19 PHP
PHP学习笔记(二):变量详解
2015/04/17 PHP
php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法
2018/02/06 PHP
Thinkphp框架+Layui实现图片/文件上传功能分析
2020/02/07 PHP
javascript实现的像java、c#之类的sleep暂停的函数代码
2010/03/04 Javascript
JQuery给元素添加/删除节点比如select
2013/04/02 Javascript
关于JS判断图片是否加载完成且获取图片宽度的方法
2013/04/09 Javascript
JQEasy-ui在IE9以下版本中二次加载的问题分析及处理方法
2014/06/23 Javascript
JS中绑定事件顺序(事件冒泡与事件捕获区别)
2017/01/24 Javascript
详解Angular 4.x NgTemplateOutlet
2017/05/24 Javascript
vue 中自定义指令改变data中的值
2017/06/02 Javascript
详解node字体压缩插件font-spider的用法
2018/09/28 Javascript
浅谈js闭包理解
2019/03/28 Javascript
vue cli3 配置proxy代理无效的解决
2019/10/30 Javascript
React实现轮播效果
2020/08/25 Javascript
vue中activated的用法
2021/01/03 Vue.js
[00:43]拉比克至宝魔导师密钥展示
2018/12/20 DOTA
python 弹窗提示警告框MessageBox的实例
2019/06/18 Python
python的几种矩阵相乘的公式详解
2019/07/10 Python
浅谈SciPy中的optimize.minimize实现受限优化问题
2020/02/29 Python
python实现图片横向和纵向拼接
2020/03/05 Python
Python HTMLTestRunner库安装过程解析
2020/05/25 Python
Django-silk性能测试工具安装及使用解析
2020/11/28 Python
比利时的在线灯具店:Lampen24.be
2019/07/01 全球购物
SmartBuyGlasses比利时:购买品牌太阳镜和眼镜
2019/08/09 全球购物
新西兰最大的天然保健及护肤品网站:HealthPost(直邮中国)
2021/02/13 全球购物
歌唱比赛获奖感言
2014/01/21 职场文书
酒店销售经理岗位职责
2014/01/31 职场文书
4s店活动策划方案
2014/08/25 职场文书
领导干部民主生活会自我剖析材料范文
2014/09/20 职场文书
Python爬虫基础之初次使用scrapy爬虫实例
2021/06/26 Python
Python获取指定日期是"星期几"的6种方法
2022/03/13 Python
Vue OpenLayer 为地图绘制风场效果
2022/04/24 Vue.js
Python可视化神器pyecharts绘制水球图
2022/07/07 Python