2013-05-03 86 views
1

借用dfowler傑出的Jabbr項目,我借用代碼來嵌入用戶帖子中的鏈接內容。該代碼是從here,並使用正則表達式來提取URL進行額外的處理和嵌入。正則表達式匹配URL/URI,除非包含在img標記中

在我的情況下,我嘗試通過一個降價處理器首先運行用戶帖子,然後再嘗試嵌入。降價處理器(MarkdownDeep)將在用戶正確設置降價格式的情況下將任何給定的圖片降價轉換爲有效的HTML img標籤。然而,這很好用,使用嵌入式內容提供程序將使圖像顯示兩次,因爲它從降級轉換中有效地顯示,然後在嵌入後再嵌入。

所以,我相信我的問題的解決方案在於,當找到的URL已經包含在有效的img標籤中時,將正則表達式更改爲不匹配。

爲了便於回答這個正則表達式到目前爲止的是:

(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'"".,<>?«»「」‘’])) 

我想,我想使用負前瞻像this answer排除IMG,但我太可憐了,在正則表達式的語法來實行它自己。

注意:如果它們只出現在文本中,我希望它仍然匹配圖像。所以http://www.example.com/sites/default/files/DellComputer.jpg將匹配 或在超鏈接<a href='http://www.example.com/sites/default/files/DellComputer.jpg'>會匹配,但<img src='http://www.example.com/sites/default/files/DellComputer.jpg'>不會。

感謝您的幫助,我知道你們中有些人擁有專家級的正則表達能力,我永遠無法做到。

+0

圖像是具有特定擴展名的東西,還是您想要二進制檢查? – fotanus 2013-05-03 15:52:37

+0

沒有二進制檢查。無論圖像與否都匹配URL,但如果包含在html img標籤中則排除URL。 – mlutter 2013-05-03 15:55:42

+1

處理並刪除'img'標籤,然後將其餘的網址與網址進行匹配。在一個正則表達式中做太多事情只會讓寫入,調試和維護變得不必要地複雜化。 – nhahtdh 2013-05-03 15:55:54

回答

1

對於簡單的方法,只是在前面加上

(?<!img.*) 

到你的正則表達式的開始。它會匹配它已經做的,但會拒絕它,如果img來到它之前的某處。所以,整個正則表達式:

(?<!img.*)(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'"".,<>?«»「」‘’])) 

再次,沒有改變,除了在開始幾個字符。

如果你需要它在img位於上線之前更聰明,我可能會推薦使用正則表達式以外的工具。

+0

這不包括'嘿,看看這個imgur鏈接: link text'這應該匹配和執行嵌入。我想我將不得不使用你的另一種工具的建議......可能@nhahtdh建議剝離有效的img標籤,然後處理... – mlutter 2013-05-03 17:15:27

+0

是的,那是我的意思。如果你需要更多的智能,你應該使用另一個工具,可能是一個XML解析器,而不是試圖用正則表達式解析HTML([必備鏈接](http://stackoverflow.com/questions/1732348/regex-match-open-標籤 - 除了-XHTML-自足標籤)) – femtoRgon 2013-05-03 17:34:38

相關問題