php正则匹配图片路径:
使用kindeditor保存文章,需要取出第N个图片的地址作为文章的标志图片,文章代码(内容的html)保存到数据库一个字段,然后图片地址保存到另外一个字段。
上面的地址是直接获取img标签内src属性的值。在使用该正则的php页面访问该路径如果能找到图片的话,可以直接使用,如果不能,可以使用preg_match_all将所有地址先保存到数组,然后处理路径,比如获取文件名称(不含路径部分),然后重新组成url,再删除图片。
例子:
内容部分被php给加上\转义了,需要先把\去除,str_ireplace("\\","",$content),然后将匹配的内容保存到$arr数组(二维的).
$arr[1]就是存储该路径的数组.
再谈php正则提取图片地址
参考之前的文章,小议php正则提取图片地址的方法,提取src=/blog_article/里面的图片地址还不足够,因为不能保证那个地址一定是绝对地址,完全的地址,如果那是相对的呢?如果地址诸如:_br/index.html>
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./pics/nav/lg_main_a6.png
和
http://img3.////pics////nav///lg_main_a6.png
于是,对于一开始提到的两个相对地址如果要强行加入某前缀恢复成绝对地址的话,也不管前面有没有“/”,只管加一个“/”就好,“有杀错,没放过” 嘛,多一个显示仍会正常,但少一个“/”。
通常匹配域名的格式要求:
2、各级域名之间用实点(.)连接,三级域名的长度不能超过20个字符。
3、由多个标号组成的完整域名总共不超过255个字符。
匹配域名的正则:
2、每级要以“.”连接
3、三级不能域名长度不超过20 {1,20}
来看一个例子,
<?php $url = 'www.test.com'; $search = '/---正则N---/'; if(preg_match($search,$url)){ echo '匹配'; }else { echo '不匹配'; } //edit by www. ?>
以下正则表达式,均来源于网络,供大家学习参考。
正则1
\b([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}\b
错误匹配:长度>60
正则2
^(([^-][a-z0-9A-Z-_]+\.)*)[^-][a-z0-9A-Z-_]+(\.[a-zA-Z]{2,4}){1,2}$
错误匹配:长度>60
错误匹配:www.te_st.com
正则3
(([\w\d\-_]+\.):?[^-_])+\w{2,4}
不匹配:test.com.cn
错误匹配:www.te_st.com
正则4
[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+.?
暂无错误
正则5
(?<=\.)([a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}
不能匹配二级域名
正则6
([a-z0-9][a-z0-9\-]*?\.(?:com|cn|net|org|gov|info|la|cc|co)(?:\.(?:cn|jp))?)$
一些顶级域名不能匹配,慎用。
在html页面中,图片网址规范的html代码一般为:
<img src="/blog_article/囧1/index.html" title="囧2" alt="囧3" border="囧4" width="囧5" height="囧6" />
囧2和囧4是非必需的,若要通过XHTML认证囧1、囧3、囧5、囧6必不可少。
就正则谈正则的话,最短匹配为:
(?<=img.+?src="/blog_article/)/(/._")
不过,这条在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=/blog_article/”之间定长基本上是不可能的。通常,图片地址的img和src只会相隔一个很简单的空格,但不排除某些情况在src之前,img后有alt、titlte等东西。_br/index.html>
所以
或
(?<=img\ssrc="/blog_article/)/(/._")
单纯
(?<=src="/blog_article/)/(/._")
不行吗?
通常情况,可以,但除了图片地址用src开头以外,javascript地址也用src开头!
把图片的后缀列出来,是否可以呢?例如:
你见过没有后缀的图片? 有很多这样的例子
SmackDown http://us./content/media/images/Headers/15854138
NXT http://us./content/media/images/Headers/15929136
Superstars http://us./content/media/images/Headers/15815850
上面的网址都是图片,但都没有传统后缀,遇到这样的地址,还是会束手无策。
此时,可以这样:
<img(.*?)src="/blog_article/(/)(/._")
这次的结果中array[0]的内容不是我们想要的,我们要的图片地址在array[2]里。
因为用了2个 (.*?),每个“()”的东西会自动存在一个组里,而array[0]代表结果的汇总,array[1]包含了img和src里的所有东西,array[2]才轮到我们想要的图片地址。这种匹配方法,既能匹配有传统后缀的图片,也能匹配一些无后缀的图片文件,同时又不会杀错其它src=/blog_article/文件。_/p/index.html>
有关php正则提取图片地址的建议:
如果图片地址的格式是img空格src=/blog_article/这种形式,请使用:/index.html(?<=img.src="/blog_article/)/(/._") ,数组唯一。
否则,请使用<img(.*?)src="/blog_article/(/)(/._") ,记得留意有用内容所在的数组位置。
就介绍这些吧,写的有点乱,不过真的希望可以帮助大家理解php正则的用法。