php正则提取图片地址

 最近在开发程序的时候需要获取提取内容中的图片地址,这里简单分享下方法,需要的朋友可以参考下

迷上了正则,不断尝试着新花招,首先感谢TNA 的非完全输出RSS,然后再次感谢SH的强迫性学习。没有TNA,我不会去看正则,更不知道世界上有种这么牛的表达式;不是SH的死活说他不懂不知道,我也不会硬着头皮去琢磨,去改进。达到同一个目的,正则的表达方式可以不唯一,没有做不到,只有你没想到。可以这样说吧,正则就是玩设定规律,我大爱这种东西。没有比设定规律筛选东西更让我兴奋、感到awesome的了。
 
分享一下在php环境下使用正则提取图片地址的一些小心得:
 
图片网址规范的html代码无非就是
 
代码如下:
<img title="囧2" src="http://www.xlanda.net/wp-admin/%E5%9B%A73" alt="囧4" title="囧2" width="5" height="6" /> 
 
 
囧1和囧2是非必需的,若要通过XHTML认证囧4、囧5、囧6必不可少,囧3是核心内容,当然就不能少了。
 
就正则谈正则的话,我写出的最短匹配是
 
 代码如下:
(?<=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=").*?(?=")
 

代码如下:
(?<=imgssrc=").*?(?=")
 
 
可能可以,但不保证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////// 是一样的!
 
lg_main_a6.png
 

 
lg_main_a6.png
 
最终你都能到达 
 
于是,对于一开始提到的两个相对地址如果要强行加入某前缀恢复成绝对地址的话,也不管前面有没有“/”,只管加一个“/”就好,“有杀错,没放过” 嘛,多一个显示仍会正常,但少一个“/”,嘿嘿,你就别想成功了。开始的时候我还没意识到这种东西,复制了一大段代码,把一样的东西硬生生弄两份,一份加 “./.”,一份不加。我这个火星来的,浪费时间了。
 
放出2个地址,公测一下网页获取图片的情况:
 
针对任何网页,需要登入的除外:http://xyark.serw5.com/img.php 
针对Coppermine Photo Gallery 系统:http://xyark.serw5.com/g.php (如果你认为弹出原图的js页面也需要的话,我只好囧你了)
 
普页是个对抓取任何图片的尝试,系统专页是为了展示什么叫做具体情况具体分析。试过的童鞋会知道,普页对某些使用Coppermine Photo Gallery系统的网站是行不通的,原因何在?就是那个前缀搞的鬼!但系统专页就能很好地避开了这个问题。
 
如果大家在测试时发现任何bug,欢迎留言告知。请低调测试,谢谢合作。
 
注:以上话题纯粹出于就正则谈正则,光技术谈技术,不可作非正当用途。若非正当使用而引发任何杯具、餐具本人概不负责。
 
 

时间: 2024-10-26 19:39:24

php正则提取图片地址的相关文章

小谈php正则提取图片地址_php技巧

迷上了正则,不断尝试着新花招,首先感谢TNA 的非完全输出RSS,然后再次感谢SH的强迫性学习.没有TNA,我不会去看正则,更不知道世界上有种这么牛的表达式:不是SH的死活说他不懂不知道,我也不会硬着头皮去琢磨,去改进.达到同一个目的,正则的表达方式可以不唯一,没有做不到,只有你没想到.可以这样说吧,正则就是玩设定规律,我大爱这种东西.没有比设定规律筛选东西更让我兴奋.感到awesome的了. 分享一下在php环境下使用正则提取图片地址的一些小心得: 图片网址规范的html代码无非就是 复制代码

正则获取图片地址 链接地址_正则表达式

复制代码 代码如下: reg = /<[img|href][^>]*src\s*=\s*('|")?([^'">]*)\1([^>])*>/ig 正则获取图片地址 一.问题: 采集的过程中遇到一个问题:从数据库里读出来的图片没有正常显示,分析后发现是数据库里的图片以网站根目录为相对路径方式存储,图片地址如:/uploads/allimg/090403/012F31N9-1.jpg,原来做的读取图片是以http://开关的URL绝对图片获取,所以采集中出现以

正则获取图片地址 链接地址

复制代码 代码如下:reg = /<[img|href][^>]*src\s*=\s*('|")?([^'">]*)\1([^>])*>/ig 正则获取图片地址 一.问题: 采集的过程中遇到一个问题:从数据库里读出来的图片没有正常显示,分析后发现是数据库里的图片以网站根目录为相对路径方式存储,图片地址如:/uploads/allimg/090403/012F31N9-1.jpg,原来做的读取图片是以http://开关的URL绝对图片获取,所以采集中出现以根

用正则解析图片地址,并利用XMLHTTP组件将其保存(是个好东西哦,我找了很久!)

xml|正则 现在基于WEB页的HTML的编辑器在新闻系统,文章系统中用得越来越广,一个网页一粘就可以保持原来的样式,同时图片也可以在这个页中保持.但是在使用过程中,如果所粘贴页中的图片被删除,就会在自己的页面上留下一个大大的"X",影响美观.以前只好把这个图片保存下来,再重新上传到服务器上,这样实在麻烦.能不能让服务器自动去下载图片保存在服务器并且替换页面上的链接?答案是肯定的.要实现这个功能需要经过三个步骤:一,取得原页中的图片的地址.方法很多,可以用分割字符串,也可以用正则匹配.

用正则解析图片地址,并利用XMLHTTP组件将其保存

xml|正则 现在基于WEB页的HTML的编辑器在新闻系统,文章系统中用得越来越广,一个网页一粘就可以保持原来的样式,同时图片也可以在这个页中保持.但是在使用过程中,如果所粘贴页中的图片被删除,就会在自己的页面上留下一个大大的"X",影响美观.以前只好把这个图片保存下来,再重新上传到服务器上,这样实在麻烦.能不能让服务器自动去下载图片保存在服务器并且替换页面上的链接?答案是肯定的. 要实现这个功能需要经过三个步骤: 一,取得原页中的图片的地址.方法很多,可以用分割字符串,也可以用正则匹

解析PHP正则提取或替换img标记属性

<?php/*PHP正则提取图片img标记中的任意属性*/$str = '<center><img src="https://img.lookmw.cn/images/20100516000.jpg" height="120" width="120"><br />PHP正则提取或更改图片img标记中的任意属性</center>'; //1.取整个图片代码preg_match('/<s*i

PHP 提取图片img标记中的任意属性

 这篇文章主要介绍了PHP 提取图片img标记中的任意属性的简单实例,有需要的朋友可以参考一下  代码如下: <?php   /* PHP正则提取图片img标记中的任意属性 */   $str = '<center><img src="https://img.lookmw.cn/images/20100516000.jpg" height="120" width="120"><br />PHP正则提取或更

PHP 提取图片img标记中的任意属性的简单实例_php实例

复制代码 代码如下: <?php /* PHP正则提取图片img标记中的任意属性 */ $str = '<center><img src="https://img.lookmw.cn/images/20100516000.jpg" height="120" width="120"><br />PHP正则提取或更改图片img标记中的任意属性</center>'; //1.取整个图片代码preg_

解析PHP正则提取或替换img标记属性_php技巧

<?php/*PHP正则提取图片img标记中的任意属性*/$str = '<center><img src="https://img.lookmw.cn/images/20100516000.jpg" height="120" width="120"><br />PHP正则提取或更改图片img标记中的任意属性</center>'; //1.取整个图片代码preg_match('/<\s*