小谈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中文字母数字验证码实现代码
Apr 25 PHP
php删除页面记录 同时刷新页面 删除条件用GET方式获得
Jan 10 PHP
一漂亮的PHP图片验证码实例
Mar 21 PHP
PHP中preg_match正则匹配中的/u、/i、/s含义
Apr 17 PHP
Yii使用技巧大汇总
Dec 29 PHP
3种方法轻松处理php开发中emoji表情的问题
Jul 18 PHP
php+mysql查询实现无限下级分类树输出示例
Oct 03 PHP
Thinkphp3.2实用篇之计算型验证码示例
Feb 09 PHP
PHP实现的简单适配器模式示例
Jun 22 PHP
Laravel如何使用数据库事务及捕获事务失败后的异常详解
Oct 23 PHP
phpMyAdmin通过密码漏洞留后门文件
Nov 20 PHP
PHP中类与对象功能、用法实例解读
Mar 27 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
星际争霸教主Flash的ID由来:你永远不会知道他之前的ID是www!
2019/01/18 星际争霸
使用php清除bom示例
2014/03/03 PHP
yii使用bootstrap分页样式的实例
2017/01/17 PHP
用JavaScript脚本实现Web页面信息交互
2006/12/21 Javascript
javascript使用onclick事件改变选中行的颜色
2013/12/30 Javascript
用简洁的jQuery方法toggleClass实现隔行换色
2014/10/22 Javascript
javascript中var的重要性分析
2015/02/11 Javascript
基于jQuery实现的无刷新表格分页实例
2016/02/17 Javascript
深入理解JavaScript函数参数(推荐)
2016/07/26 Javascript
JavaScript中函数声明与函数表达式的区别详解
2016/08/18 Javascript
使用jquery.qrcode.js生成二维码插件
2016/10/17 Javascript
基于javascript实现按圆形排列DIV元素(一)
2016/12/02 Javascript
javascript设计模式之中介者模式学习笔记
2017/02/15 Javascript
Javascript操作dom对象之select全面解析
2017/04/24 Javascript
全面解析Node.js 8 重要功能和修复
2017/06/02 Javascript
NodeJS使用七牛云存储上传文件的方法
2017/07/24 NodeJs
JS实现的对象去重功能示例
2019/06/04 Javascript
vuejs+element UI table表格中实现禁用部分复选框的方法
2019/09/20 Javascript
Python在不同目录下导入模块的实现方法
2017/10/27 Python
python 实现将字典dict、列表list中的中文正常显示方法
2018/07/06 Python
基于python实现名片管理系统
2018/11/30 Python
解决Python中定时任务线程无法自动退出的问题
2019/02/18 Python
Python从入门到精通之环境搭建教程图解
2019/09/26 Python
pytorch查看torch.Tensor和model是否在CUDA上的实例
2020/01/03 Python
Pytorch 使用CNN图像分类的实现
2020/06/16 Python
基于canvas的骨骼动画的示例代码
2018/06/12 HTML / CSS
在数据文件自动增长时,自动增长是否会阻塞对文件的更新
2014/05/01 面试题
工作中的自我评价如何写好
2013/10/28 职场文书
简短的公司员工自我评价分享
2013/11/13 职场文书
部队领导证婚词
2014/01/12 职场文书
计划生育宣传标语
2014/06/21 职场文书
2014年物业公司工作总结
2014/11/22 职场文书
婚内分居协议书范文
2014/11/26 职场文书
创先争优个人总结
2015/03/04 职场文书
幼师自荐信范文(2016推荐篇)
2016/01/28 职场文书
重温经典:乔布斯在斯坦福大学的毕业演讲(双语)
2019/08/26 职场文书