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
最终你都能到达
图片网址规范的html代码无非就是
1 <img src="??" title="??" alt="??" border="??" width="??" height="??" />
??和??是非必需的,若要通过XHTML认证??、??、??、??必不可少。
就正则谈正则的话,我写出的最短匹配是
1 (?<=img.+?src=").*?(?=")
不过,这条在php里不行,会出现:
1 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等东西。
所以
1 (?<=img.src=").*?(?=")
或
1 (?<=imgssrc=").*?(?=")
可能可以,但不保证100%没问题。
你也许会问,单纯
1 (?<=src=").*?(?=")
不行吗?通常情况,可以,但,搜索过页面的盆友应该知道,除了图片地址用src开头以外,javascript地址也用src开头!而且,太多神通广大的不可预知因素隐含其中,于是这个貌似很简短完美的写法就行不通了。
你又或许会问,聪明简短的不行,我把图片的后缀列出来,总该可以了吧,如
1 (?<=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
上面的网址都是图片,但都没有传统后缀,你老实也没用,还是不能获取到它们。
怎么办呢?还可以这样
1 <img(.*?)src="(.*?)(?=")
和上面的表达式不同,这次的结果中array[0]的内容不是我们想要的,我们要的图片地址在array[2]里。为什么呢?因为我们用了2个 (.*?),每个“()”的东西会自动存在一个组里,而array[0]代表结果的汇总,array[1]包含了img和src里的所有东西,array[2]才轮到我们想要的图片地址。这种匹配方法,既能匹配有传统后缀的图片,也能匹配一些无后缀的图片文件,同时又不会杀错其它src=文件。个人感觉还是不错的,呵呵。当然了,如果你还有更好的建议,请马上留言,全球人民都会感谢你!
你到底要什么样的图片,是固定格式还是其它?得具体情况具体分析呢。
我的建议是:
如果你要的图片地址的格式是img空格src=的,请使用:(?<=img.src=").*?(?=") ,数组唯一,你懂的。
否则,请使用<img(.*?)src="(.*?)(?=") ,记得留意有用内容所在的数组位置哦!
并在项目中使用了很长时间的正则吧.
/<img.*srcs*=s*["|']?s*([^>"'s]*)/i
,我使用kindeditor保存文章,但是需要取出第N个图片的地址作为文章的标志图片,文章代码(内容的html)保存到数据库一个字段,然后图片地址保存到另外一个字段.我就是使用上面的正则解决的.
我说明下,上面的地址是直接获取img标签内src属性的值.在使用该正则的php页面访问该路径如果能找到图片的话,可以直接使用,如果不能,你可以使用preg_match_all将所有地址先保存到数组,然后处理路径,比如获取文件名称(不含路径部分),然后重新组成url,再删除图片.
我的例子:
preg_match_all("/<img.*srcs*=s*["|']?s*([^>"'s]*)/i",str_ireplace("\","",$content),$arr);
呵呵 我的内容部分被php给加上转义了,所以我需要先把去除,str_ireplace("\","",$content),然后将匹配的内容保存到$arr数组(二维的).
$arr[1]就是存储该路径的数组.
判断一个字符串是否含有超级链接
代码如下 | 复制代码 |
$str="ssdsf<a target='_blank' href='http://www.111cn.net/' >sdf</a>sdfss"; |
下面我们只要过滤连接部份。
代码如下 | 复制代码 |
<?php |
正则:/(?<=href=)([^>]*)(?=>)/
(?<=exp) 匹配exp后面的位置
(?=exp) 匹配exp前面的位置
此正则 匹配 在 href= 之后 “>” 之前 的 非 “>” 的所有字符
例子:<a href='www.111cn.net '>
找到这些字符(url)用 # 替换,就可以去掉html里的所有链接。
现在分享一个提取超级连接的实例
代码如下 | 复制代码 |
function match_links($document) { preg_match_all("'<s*as.*?hrefs*=s*(["'])?(?(1)(.*?)\1|([^s>]+))[^>]*>?(.*?)</a>'isx",$document,$links); while(list($key,$val) = each($links[2])) { if(!empty($val)) $match['link'][] = $val; } while(list($key,$val) = each($links[3])) { if(!empty($val)) $match['link'][] = $val; } while(list($key,$val) = each($links[4])) { if(!empty($val)) $match['content'][] = $val; } while(list($key,$val) = each($links[0])) { if(!empty($val)) $match['all'][] = $val; } return $match; } |
分享一个同事写的URL正则表达式,缺点不支持中文URL:
代码如下 | 复制代码 |
(http[s]{0,1}|ftp)://[a-zA-Z0-9\.\-]+\.([a-zA-Z]{2,4})(:\d+)?(/[a-zA-Z0-9\.\-~!@#$%^&*+?:_/=<>]*)? |
下面介绍一个可以支持中文正则url
代码如下 | 复制代码 |
var regexp = new RegExp("(http[s]{0,1}|ftp)://[a-zA-Z0-9\.\-]+\.([a-zA-Z]{2,4})(:\d+)?(/[a-zA-Z0-9\.\-~!@#$%^&*+?:_/=<>]*)?", "gi"); var urls = textbox.value.match(regexp) || [];//textbox为文本框 console.log(urls); |
实例
代码如下 | 复制代码 |
<?php // Gets links from the page and formats them to a full valid url: |
我们核心代码就是正则表达试了
代码如下 | 复制代码 |
function get_all_url($code){ |
上面只是简单的下面看全例
代码如下 | 复制代码 |
$url ='http://www.111cn.net'; |
利用curl函数来获取
代码如下 | 复制代码 |
<?php $ch = curl_init(); curl_close($ch); printf("<p>此页面的所有链接为:</p><pre>%s</pre>n", var_export($linkresult , true)); ?> |
获取所有网址,但只有不重复的数据
代码如下 | 复制代码 |
<? |
数据库结构
代码如下 | 复制代码 |
-- phpMyAdmin SQL Dump SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; -- -- -------------------------------------------------------- -- CREATE TABLE IF NOT EXISTS `customer` ( -- INSERT INTO `customer` (`id`, `username`, `solutation`, `phone`, `company`, `mobile`, `source`, `sdate`, `job`, `web`, `email`, `createtime`, `modifiedtime`, `note`) VALUES |
php代码
代码如下 | 复制代码 |
<?php $(".edit_email").editable('save.php', { <body>
|
sava.php代码
代码如下 | 复制代码 |
<?php $field=$_POST['id']; $val=$_POST['value']; |
例下载地址:http://file.111cn.net/download/2013/05/16/3788_72817.rar
相关文章
使用PHP+JavaScript将HTML页面转换为图片的实例分享
这篇文章主要介绍了使用PHP+JavaScript将HTML元素转换为图片的实例分享,文后结果的截图只能体现出替换的字体,也不能说将静态页面转为图片可以加快加载,只是这种做法比较interesting XD需要的朋友可以参考下...2016-04-19- 这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
- 今天小编在这里就来给各位Photoshop的这一款软件的使用者们来说说把古装美女图片转为细腻的工笔画效果的制作教程,各位想知道方法的使用者们,那么下面就快来跟着小编一...2016-09-14
- 这篇文章主要介绍了Python 图片转数组,二进制互转操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
- php如何实现抓取网页图片,相较于手动的粘贴复制,使用小程序要方便快捷多了,喜欢编程的人总会喜欢制作一些简单有用的小软件,最近就参考了网上一个php抓取图片代码,封装了一个php远程抓取图片的类,测试了一下,效果还不错分享...2015-10-30
- 有一个项目要获取页面中所有img标签中的图片地址,这里我们使用到了preg_match_all正则函数,然后看我下面的一些参数即可实现了。 例 代码如下 复制代码 ...2016-11-25
jquery左右滚动焦点图banner图片鼠标经过显示上下页按钮
jquery左右滚动焦点图banner图片鼠标经过显示上下页按钮...2013-10-13- 下面小编就为大家带来一篇利用JS实现点击按钮后图片自动切换的简单方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2016-10-25
- Photoshop的这一款软件小编相信很多的人都已经是使用过了吧,那么今天小编在这里就给大家带来了用Photoshop软件制作枪战电影海报的教程,想知道制作步骤的玩家们,那么下面...2016-09-14
- 这篇文章主要为大家详细介绍了js实现上传图片及时预览的相关资料,具有一定的参考价值,感兴趣的朋友可以参考一下...2016-05-09
- 这篇文章主要给大家介绍了一个关于JS正则匹配的踩坑记录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-04-13
- 图片剪裁是常用的方法,那么如何通过4坐标剪裁图片,本文就详细的来介绍一下,感兴趣的小伙伴们可以参考一下...2021-06-04
- 共享一段使用PHP下载CSS文件中的图片的代码 复制代码 代码如下: <?php //note 设置PHP超时时间 set_time_limit(0); //note 取得样式文件内容 $styleFileContent = file_get_contents('images/style.css'); //not...2013-10-04
- PHP代码如下:复制代码 代码如下:if (isset($_FILES["Filedata"]) || !is_uploaded_file($_FILES["Filedata"]["tmp_name"]) || $_FILES["Filedata"]["error"] != 0) { $upload_file = $_FILES['Filedata']; $fil...2013-10-04
- 这篇文章主要给大家介绍了关于微信小程序如何获取图片宽度与高度的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-10
C#中图片旋转和翻转(RotateFlipType)用法分析
这篇文章主要介绍了C#中图片旋转和翻转(RotateFlipType)用法,实例分析了C#图片旋转及翻转Image.RotateFlip方法属性的常用设置技巧,需要的朋友可以参考下...2020-06-25- ps软件是现在很多人比较喜欢的,有着非常不错的使用效果,这次文章就给大家介绍下ps怎么制作图片阴影效果,还不知道制作方法的赶紧来看看。 ps图片阴影效果怎么做方法/...2017-07-06
- 这篇文章主要介绍了OpenCV如何去除图片中的阴影的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-29
- 本文主要介绍用C#实现图片转换成字节流,字节流转换成图片,并根据图片路径返回图片的字节流,有需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了JavaScript 如何禁止用户保存图片,帮助大家完成需求,更好的理解和使用JavaScript,感兴趣的朋友可以了解下...2020-11-19