小谈php正则提取图片地址


Posted in PHP onMarch 27, 2014

迷上了正则,不断尝试着新花招,首先感谢TNA 的非完全输出RSS,然后再次感谢SH的强迫性学习。没有TNA,我不会去看正则,更不知道世界上有种这么牛的表达式;不是SH的死活说他不懂不知道,我也不会硬着头皮去琢磨,去改进。达到同一个目的,正则的表达方式可以不唯一,没有做不到,只有你没想到。可以这样说吧,正则就是玩设定规律,我大爱这种东西。没有比设定规律筛选东西更让我兴奋、感到awesome的了。

分享一下在php环境下使用正则提取图片地址的一些小心得:

图片网址规范的html代码无非就是

<img title="??" src="http://www.xlanda.net/wp-admin/%E5%9B%A73" alt="??" title="??" width="5" height="6" />

??和??是非必需的,若要通过XHTML认证??、??、??必不可少,??是核心内容,当然就不能少了。

就正则谈正则的话,我写出的最短匹配是

(?<=img.+?src=").*?(?=")

不过,这条在php里不行,会出现:

Warning: preg_match_all() [function.preg-match-all]: Compilation failed: lookbehind assertion is not fixed length at offset *** in ***

纠结了很久,都不行,原因何在呢?试了很多次,终于发现问题在(?<=img.+?src=")这个零宽断言里,在php中,零宽断言里不支持类似“*”、“+”这些无限次的东西,于是报错了,把“.+?”改为定长就好。不过,要“img”和“src=”之间定长基本上是不可能的。通常,图片地址的img和src只会相隔一个很简单的空格,但不排除某些情况在src之前,img后有alt、titlte等东西。

所以

(?<=img.src=").*?(?=")


(?<=img\ssrc=").*?(?=")

可能可以,但不保证100%没问题。

你也许会问,单纯

(?<=src=").*?(?=")

不行吗?通常情况,可以,但,搜索过页面的盆友应该知道,除了图片地址用src开头以外,javascript地址也用src开头!而且,太多神通广大的不可预知因素隐含其中,于是这个貌似很简短完美的写法就行不通了。

你又或许会问,聪明简短的不行,我把图片的后缀列出来,总该可以了吧,如

(?<=src=").*?\.(jpg|jpeg|gif|png|bmp|JPG|JPEG|GIF|PNG|BMP)

的确,这个写法实在是很老实,不过,你见过没有后缀的图片?wwe.com 有很多这种例子呢

RAW http://us.wwe.com/content/media/images/Headers/15559182
SmackDown http://us.wwe.com/content/media/images/Headers/15854138
NXT http://us.wwe.com/content/media/images/Headers/15929136
Superstars http://us.wwe.com/content/media/images/Headers/15815850

上面的网址都是图片,但都没有传统后缀,你老实也没用,还是不能获取到它们。

怎么办呢?还可以这样

<img(.*?)src="(.*?)(?=")

和上面的表达式不同,这次的结果中array[0]的内容不是我们想要的,我们要的图片地址在array[2]里。为什么呢?因为我们用了2个 (.*?),每个“()”的东西会自动存在一个组里,而array[0]代表结果的汇总,array[1]包含了img和src里的所有东西,array[2]才轮到我们想要的图片地址。这种匹配方法,既能匹配有传统后缀的图片,也能匹配一些无后缀的图片文件,同时又不会杀错其它src=文件。个人感觉还是不错的,呵呵。当然了,如果你还有更好的建议,请马上留言,全球人民都会感谢你!

你到底要什么样的图片,是固定格式还是其它?得具体情况具体分析呢。

我的建议是:

如果你要的图片地址的格式是img空格src=的,请使用:(?<=img.src=").*?(?=") ,数组唯一,你懂的。

否则,请使用<img(.*?)src="(.*?)(?=") ,记得留意有用内容所在的数组位置哦!

再谈php正则提取图片地址

前天写了小谈php正则提取图片地址 ,但其实,提取src=里面的图片地址还不足够,因为不能保证那个地址一定是绝对地址,完全的地址,如果那是相对的呢?如果地址诸如:

albums/Candids/thumb_P1050338.jpg
/content/media/touts/5271608/5271654/15320982

那该如何是好?

有时在这些地址前面需要加http://example1.com/ ,有些甚至要加http://example1.com/example2/.../ 于是,要写出出一种法则符合所有要求,简直是天方夜谭。只能见机行事对症下药。有时,需要从前面动刀,有时需要从后面砍断。

今天,我惊讶地知道了一个道理,原来http://example.com/ 和http://example.com////// 是一样的!

http://img3.douban.com/pics/nav/lg_main_a6.png

http://img3.douban.com////pics////nav///lg_main_a6.png

最终你都能到达

于是,对于一开始提到的两个相对地址如果要强行加入某前缀恢复成绝对地址的话,也不管前面有没有“/”,只管加一个“/”就好,“有杀错,没放过” 嘛,多一个显示仍会正常,但少一个“/”,嘿嘿,你就别想成功了。开始的时候我还没意识到这种东西,复制了一大段代码,把一样的东西硬生生弄两份,一份加 “./.”,一份不加。我这个火星来的,浪费时间了。

放出2个地址,公测一下网页获取图片的情况:

针对任何网页,需要登入的除外:http://xyark.serw5.com/img.php
针对Coppermine Photo Gallery 系统:http://xyark.serw5.com/g.php (如果你认为弹出原图的js页面也需要的话,我只好?迥懔耍?/P>

普页是个对抓取任何图片的尝试,系统专页是为了展示什么叫做具体情况具体分析。试过的童鞋会知道,普页对某些使用Coppermine Photo Gallery系统的网站是行不通的,原因何在?就是那个前缀搞的鬼!但系统专页就能很好地避开了这个问题。

如果大家在测试时发现任何bug,欢迎留言告知。请低调测试,谢谢合作。

注:以上话题纯粹出于就正则谈正则,光技术谈技术,不可作非正当用途。若非正当使用而引发任何杯具、餐具本人概不负责。

转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://www.blogbus.com/xrspook-logs/85330456.html

PHP 相关文章推荐
用Zend Encode编写开发PHP程序
Oct 09 PHP
PHP取进制余数函数代码
Jan 19 PHP
php获取数组长度的方法(有实例)
Oct 27 PHP
PHP代码优化的53个细节
Mar 03 PHP
php数组操作之键名比较与差集、交集赋值的方法
Nov 10 PHP
PDO预处理语句PDOStatement对象使用总结
Nov 20 PHP
Zend Framework教程之配置文件application.ini解析
Mar 10 PHP
phplist及phpmailer(组合使用)通过gmail发送邮件的配置方法
Mar 30 PHP
Yii2框架BootStrap样式的深入理解
Nov 07 PHP
php中文乱码问题的终极解决方案汇总
Aug 01 PHP
php图片合成方法(多张图片合成一张)
Nov 25 PHP
php中的buffer缓冲区用法分析
May 31 PHP
php顺序查找和二分查找示例
Mar 27 #PHP
php求两个目录的相对路径示例(php获取相对路径)
Mar 27 #PHP
php环境套包 dedeampz 伪静态设置示例
Mar 26 #PHP
php去除换行(回车换行)的三种方法
Mar 26 #PHP
php的memcache类分享(memcache队列)
Mar 26 #PHP
codeigniter自带数据库类使用方法说明
Mar 25 #PHP
php使用codebase生成随机数
Mar 25 #PHP
You might like
php实现图片以base64显示的方法
2016/10/13 PHP
浅谈PHP的exec()函数无返回值排查方法(必看)
2017/03/31 PHP
PHP5.0~5.6 各版本兼容性cURL文件上传功能实例分析
2018/05/11 PHP
php app支付宝回调(异步通知)详解
2018/07/25 PHP
PHP实现的抓取小说网站内容功能示例
2019/06/27 PHP
php layui实现前端多图上传实例
2019/07/30 PHP
JavaScript的面向对象(一)
2006/11/09 Javascript
清华大学出版的事半功倍系列 javascript全部源代码
2007/05/04 Javascript
在页面中js获取光标/鼠标的坐标及光标的像素坐标
2013/11/11 Javascript
JavaScript中Math对象方法使用概述
2014/01/02 Javascript
JavaScript设计模式之抽象工厂模式介绍
2014/12/28 Javascript
jQuery+CSS3实现树叶飘落特效
2015/02/01 Javascript
全面理解JavaScript中的继承(必看)
2016/06/16 Javascript
详解Node.js如何开发命令行工具
2016/08/14 Javascript
使用React实现轮播效果组件示例代码
2016/09/05 Javascript
javascript使用递归算法求两个数字组合功能示例
2017/01/03 Javascript
JS 仿支付宝input文本输入框放大组件的实例
2017/11/14 Javascript
vue源码学习之Object.defineProperty对象属性监听
2018/05/30 Javascript
解决mpvue + vuex 开发微信小程序vuex辅助函数mapState、mapGetters不可用问题
2018/08/03 Javascript
如何封装了一个vue移动端下拉加载下一页数据的组件
2019/01/06 Javascript
深入浅出了解Node.js Streams
2019/05/27 Javascript
浅谈nuxtjs校验登录中间件和混入(mixin)
2020/11/06 Javascript
讲解python参数和作用域的使用
2013/11/01 Python
python判断一个集合是否为另一个集合的子集方法
2018/05/04 Python
对python requests发送json格式数据的实例详解
2018/12/19 Python
python3.x实现base64加密和解密
2019/03/28 Python
python实现的爬取电影下载链接功能示例
2019/08/26 Python
Django后端发送小程序微信模板消息示例(服务通知)
2019/12/17 Python
pycharm 2018 激活码及破解补丁激活方式
2020/09/21 Python
彼得罗夫美国官网:Peter Thomas Roth美国(青瓜面膜)
2017/11/05 全球购物
全球最大的游戏市场:G2A
2018/07/05 全球购物
公务员年总结的自我评价
2013/10/25 职场文书
大学生入党思想汇报
2014/01/01 职场文书
大学优秀学生主要事迹材料
2015/11/04 职场文书
Python爬虫框架之Scrapy中Spider的用法
2021/06/28 Python
在MySQL中你成功的避开了所有索引
2022/04/20 MySQL