php正則匹配圖片路徑原理與方法

來源:互聯網
上載者:User

提取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////// 是一樣的!
yun_qi_img/lg_main_a6.png

yun_qi_img/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]就是儲存該路徑的數組.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.