php 匹配图片路径_php正则匹配图片路径原理与方法
下面我來(lái)給大家介紹在php正則匹配圖片路徑原理與實(shí)現(xiàn)方法,有需要了解的朋友可進(jìn)入?yún)⒖紖⒖肌?/p>
提取src=里面的圖片地址還不足夠,因?yàn)椴荒鼙WC那個(gè)地址一定是絕對(duì)地址,完全的地址,如果那是相對(duì)的呢?如果地址諸如:
albums/Candids/thumb_P1050338.jpg
/content/media/touts/5271608/5271654/15320982
那該如何是好?
有時(shí)在這些地址前面需要加http://example1.com/ ,有些甚至要加http://example1.com/example2/.../ 于是,要寫出出一種法則符合所有要求,簡(jiǎn)直是天方夜譚。只能見(jiàn)機(jī)行事對(duì)癥下藥。有時(shí),需要從前面動(dòng)刀,有時(shí)需要從后面砍斷。
今天,我驚訝地知道了一個(gè)道理,原來(lái)http://example.com/ 和http://example.com// 是一樣的!
http://img3.douban.com/pics/nav/lg_main_a6.png
和
http://img3.douban.compicsnav///lg_main_a6.png
最終你都能到達(dá)
圖片網(wǎng)址規(guī)范的html代碼無(wú)非就是
1
??和??是非必需的,若要通過(guò)XHTML認(rèn)證??、??、??、??必不可少。
就正則談?wù)齽t的話,我寫出的最短匹配是
1 (?<=img. ?src=").*?(?=")
不過(guò),這條在php里不行,會(huì)出現(xiàn):
1 Warning: preg_match_all() [function.preg-match-all]: Compilation failed: lookbehind assertion is not fixed length at offset *** in ***
糾結(jié)了很久,都不行,原因何在呢?試了很多次,終于發(fā)現(xiàn)問(wèn)題在(?<=img. ?src=")這個(gè)零寬斷言里,在php中,零寬斷言里不支持類似“*”、“ ”這些無(wú)限次的東西,于是報(bào)錯(cuò)了,把“. ?”改為定長(zhǎng)就好。不過(guò),要“img”和“src=”之間定長(zhǎng)基本上是不可能的。通常,圖片地址的img和src只會(huì)相隔一個(gè)很簡(jiǎn)單的空格,但不排除某些情況在src之前,img后有alt、titlte等東西。
所以
1 (?<=img.src=").*?(?=")
或
1 (?<=imgssrc=").*?(?=")
可能可以,但不保證100%沒(méi)問(wèn)題。
你也許會(huì)問(wèn),單純
1 (?<=src=").*?(?=")
不行嗎?通常情況,可以,但,搜索過(guò)頁(yè)面的盆友應(yīng)該知道,除了圖片地址用src開(kāi)頭以外,javascript地址也用src開(kāi)頭!而且,太多神通廣大的不可預(yù)知因素隱含其中,于是這個(gè)貌似很簡(jiǎn)短完美的寫法就行不通了。
你又或許會(huì)問(wèn),聰明簡(jiǎn)短的不行,我把圖片的后綴列出來(lái),總該可以了吧,如
1 (?<=src=").*?.(jpg|jpeg|gif|png|bmp|JPG|JPEG|GIF|PNG|BMP)
的確,這個(gè)寫法實(shí)在是很老實(shí),不過(guò),你見(jiàn)過(guò)沒(méi)有后綴的圖片?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
上面的網(wǎng)址都是圖片,但都沒(méi)有傳統(tǒng)后綴,你老實(shí)也沒(méi)用,還是不能獲取到它們。
怎么辦呢?還可以這樣
1
和上面的表達(dá)式不同,這次的結(jié)果中array[0]的內(nèi)容不是我們想要的,我們要的圖片地址在array[2]里。為什么呢?因?yàn)槲覀冇昧?個(gè) (.*?),每個(gè)“()”的東西會(huì)自動(dòng)存在一個(gè)組里,而array[0]代表結(jié)果的匯總,array[1]包含了img和src里的所有東西,array[2]才輪到我們想要的圖片地址。這種匹配方法,既能匹配有傳統(tǒng)后綴的圖片,也能匹配一些無(wú)后綴的圖片文件,同時(shí)又不會(huì)殺錯(cuò)其它src=文件。個(gè)人感覺(jué)還是不錯(cuò)的,呵呵。當(dāng)然了,如果你還有更好的建議,請(qǐng)馬上留言,全球人民都會(huì)感謝你!
你到底要什么樣的圖片,是固定格式還是其它?得具體情況具體分析呢。
我的建議是:
如果你要的圖片地址的格式是img空格src=的,請(qǐng)使用:(?<=img.src=").*?(?=") ,數(shù)組唯一,你懂的。
否則,請(qǐng)使用
并在項(xiàng)目中使用了很長(zhǎng)時(shí)間的正則吧.
/"'s]*)/i
,我使用kindeditor保存文章,但是需要取出第N個(gè)圖片的地址作為文章的標(biāo)志圖片,文章代碼(內(nèi)容的html)保存到數(shù)據(jù)庫(kù)一個(gè)字段,然后圖片地址保存到另外一個(gè)字段.我就是使用上面的正則解決的.
我說(shuō)明下,上面的地址是直接獲取img標(biāo)簽內(nèi)src屬性的值.在使用該正則的php頁(yè)面訪問(wèn)該路徑如果能找到圖片的話,可以直接使用,如果不能,你可以使用preg_match_all將所有地址先保存到數(shù)組,然后處理路徑,比如獲取文件名稱(不含路徑部分),然后重新組成url,再刪除圖片.
我的例子:
preg_match_all("/"'s]*)/i",str_ireplace("\","",$content),$arr);
呵呵 我的內(nèi)容部分被php給加上轉(zhuǎn)義了,所以我需要先把去除,str_ireplace("\","",$content),然后將匹配的內(nèi)容保存到$arr數(shù)組(二維的).
$arr[1]就是存儲(chǔ)該路徑的數(shù)組.
總結(jié)
以上是生活随笔為你收集整理的php 匹配图片路径_php正则匹配图片路径原理与方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 线程的语法 (event,重要)
- 下一篇: GB28181协议--心跳