小谈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 相关文章推荐
PHP扩展编写点滴 技巧收集
Mar 09 PHP
php生成随机密码的几种方法
Jan 17 PHP
PHP中的多行字符串传递给JavaScript的两种方法
Jun 19 PHP
彻底删除thinkphp3.1案例blog标签的方法
Dec 05 PHP
PHP表单数据写入MySQL数据库的代码
May 31 PHP
PHP中set_include_path()函数相关用法分析
Jul 18 PHP
简单的自定义php模板引擎
Aug 26 PHP
php实现的pdo公共类定义与用法示例
Jul 19 PHP
可兼容php5与php7的cURL文件上传功能实例分析
May 11 PHP
PHP封装的非对称加密RSA算法示例
May 28 PHP
php获取用户真实IP和防刷机制的实例代码
Nov 28 PHP
Laravel 6 将新增为指定队列任务设置中间件的功能
Aug 06 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+ACCESS 文章管理程序代码
2010/06/21 PHP
使用ThinkPHP自带的Http类下载远程图片到本地的实现代码
2011/08/02 PHP
基于Snoopy的PHP近似完美获取网站编码的代码
2011/10/23 PHP
解析posix与perl标准的正则表达式区别
2013/06/17 PHP
PHP文件缓存内容保存格式实例分析
2014/08/20 PHP
php程序员应具有的7种能力小结
2014/11/27 PHP
php+xml编程之xpath的应用实例
2015/01/24 PHP
prototype 学习笔记整理
2009/07/17 Javascript
基于jQuery的ajax功能实现web service的json转化
2009/08/29 Javascript
javascript中创建对象的三种常用方法
2010/12/30 Javascript
js注意img图片的onerror事件的分析
2011/01/01 Javascript
30个精美的jQuery幻灯片效果插件和教程
2011/08/23 Javascript
jQuery+JSON+jPlayer实现QQ空间音乐查询功能示例
2013/06/17 Javascript
append和appendTo的区别以及appendChild用法
2013/12/24 Javascript
seajs加载jquery时提示$ is not a function该怎么解决
2015/10/23 Javascript
Bootstrap源码解读排版(1)
2016/12/23 Javascript
js对象实例详解(JavaScript对象深度剖析,深度理解js对象)
2017/09/21 Javascript
深入解析koa之异步回调处理
2019/06/17 Javascript
ES6中定义类和对象的方法示例
2019/07/31 Javascript
Python合并字符串的3种方法
2015/05/21 Python
python PrettyTable模块的安装与简单应用
2019/01/11 Python
numpy数组之存取文件的实现示例
2019/05/24 Python
用Python从0开始实现一个中文拼音输入法的思路详解
2019/07/20 Python
pytorch dataloader 取batch_size时候出现bug的解决方式
2020/02/20 Python
python字典和json.dumps()的遇到的坑分析
2020/03/11 Python
浅谈keras中自定义二分类任务评价指标metrics的方法以及代码
2020/06/11 Python
SmartBuyGlasses美国官网:太阳眼镜和眼镜
2017/08/20 全球购物
澳大利亚优质的家居用品和生活方式公司:Bed Bath N’ Table
2019/04/16 全球购物
中专药剂专业应届毕的自我评价
2013/12/27 职场文书
优秀大学生的自我评价
2014/01/16 职场文书
爽歪歪广告词
2014/03/20 职场文书
2015年妇幼卫生工作总结
2015/05/23 职场文书
2019年农民幸福观调查的实践感悟
2019/12/19 职场文书
Python 正则模块详情
2021/11/02 Python
Java 超详细讲解数据结构中的堆的应用
2022/04/02 Java/Android
如何Tomcat中使用ipv6地址
2022/05/06 Servers