2010-03-18 115 views
1

我需要一個正則表達式來運行像下面這樣的字符串,它將在特定條件下將絕對路徑轉換爲相對路徑。正則表達式:絕對網址到相對網址(C#)

<p>This website is <strong>really great</strong> and people love it <img alt="" src="http://localhost:1379/Content/js/fckeditor/editor/images/smiley/msn/teeth_smile.gif" /></p> 

規則:

  • 如果URL包含 「/內容/」 我 想獲得的相對路徑

  • 如果網址不包含 「/內容/ 「,它是一個外部文件, 和絕對路徑應該保持爲

Regex unfortunatley並不是我的特長,在這一點上這對我來說太過先進了。如果有人可以提供一些提示,我會很感激。

在此先感謝。

UPDATE: 要回答在評論的問題:

  • 在應用正則表達式的時候,所有的URL將開始的「http://」
  • 這應該被應用到img和a標籤的src屬性,而不是標籤外的文本。
+0

問題:所有的URL是完全絕對的,也就是說,用http://或ftp://或其他什麼? –

+0

你只想改變img標籤的src屬性? – ZyX

回答

5

您應該考慮使用Uri.MakeRelativeUri method - 您當前的算法取決於從不包含「/ Content /」的外部文件,這對我來說似乎很危險。MakeRelativeUri將確定是否可以從當前Uri到srchref之間創建相對路徑,無論您或外部文件存儲的變化如何。

+0

這個問題真的不是一個正則表達式的工作。在這個答案中的方法將給出更可靠的結果,並且更容易編寫和理解引導。 – Ipsquiggle

+0

我欣賞這裏的建議。我不知道這種方法,完全同意正則表達式解決方案中涉及的風險。我會檢查這一點,很可能接受這個答案。 – splatto

+0

接受。謝謝 – splatto

2

除非我錯過了點,在這裏,如果你更換

^(.*)([C|c]ontent.*) 

隨着

/$2 

你將最終

/Content/js/fckeditor/editor/images/smiley/msn/teeth_smile.gif 

這隻會發生ID 「內容」被找到,所以在cae你有一個URL如:

http://localhost:1379/js/fckeditor/editor/images/smiley/msn/teeth_smile.gif 

什麼都不會被替換

希望它能幫助,而我沒有錯過任何東西。

UPDATE

顯然考慮到你所使用的HTML解析器找到A HREF內的URL(你應該在萬一你不:-)它)

乾杯

0

這是perl,我不知道c#:

[email protected](<(img|a)\s[^>]*?\s(src|href)=)(["'])http://[^'"]*?(/Content/[^'"]*?)\[email protected][email protected] 

如果c#有Perl類似的正則表達式,它將很容易移植。

+1

過於複雜。 –

+0

絕對有效的方法來做到這一點。 –

+0

你可以寫得更簡單(假設作者不使用HTML解析器)? – ZyX

0

此功能可以將所有的超鏈接和圖像源轉換你的HTML裏面絕對URL,並肯定你也可以修改它的CSS文件和JavaScript文件很容易:

Private Function ConvertALLrelativeLinksToAbsoluteUri(ByVal html As String, ByVal PageURL As String) 
    Dim result As String = Nothing 
    ' Getting all Href 
    Dim opt As New RegexOptions 
    Dim XpHref As New Regex("(href="".*?"")", RegexOptions.IgnoreCase) 
    Dim i As Integer 
    Dim NewSTR As String = html 
    For i = 0 To XpHref.Matches(html).Count - 1 
     Application.DoEvents() 
     Dim Oldurl As String = Nothing 
     Dim OldHREF As String = Nothing 
     Dim MainURL As New Uri(PageURL) 
     OldHREF = XpHref.Matches(html).Item(i).Value 
     Oldurl = OldHREF.Replace("href=", "").Replace("HREF=", "").Replace("""", "") 
     Dim NEWURL As New Uri(MainURL, Oldurl) 
     Dim NewHREF As String = "href=""" & NEWURL.AbsoluteUri & """" 
     NewSTR = NewSTR.Replace(OldHREF, NewHREF) 
    Next 
    html = NewSTR 
    Dim XpSRC As New Regex("(src="".*?"")", RegexOptions.IgnoreCase) 
    For i = 0 To XpSRC.Matches(html).Count - 1 
     Application.DoEvents() 
     Dim Oldurl As String = Nothing 
     Dim OldHREF As String = Nothing 
     Dim MainURL As New Uri(PageURL) 
     OldHREF = XpSRC.Matches(html).Item(i).Value 
     Oldurl = OldHREF.Replace("src=", "").Replace("src=", "").Replace("""", "") 
     Dim NEWURL As New Uri(MainURL, Oldurl) 
     Dim NewHREF As String = "src=""" & NEWURL.AbsoluteUri & """" 
     NewSTR = NewSTR.Replace(OldHREF, NewHREF) 
    Next 
    Return NewSTR 
End Function