正则表达式:绝对url到相对url(C#)

时间:2010-03-18 17:18:33

标签: c# asp.net-mvc regex url

我需要一个正则表达式来对抗下面的字符串,它会在某些条件下将绝对路径转换为相对路径。

<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>

规则:

  • 如果网址包含“/ Content /”我 想得到相对路径

  • 如果网址不包含 “/ Content /”,它是一个外部文件, 并且绝对路径应该保持

Regex unfortunatley不是我的强项,而且这对我来说太先进了。如果有人能提供一些技巧我会很感激。

提前致谢。

更新 要回答评论中的问题:

  • 在应用正则表达式时,所有网址都将以“http://”
  • 开头
  • 这应该应用于img和标签的src属性,而不是标签之外的文本。

4 个答案:

答案 0 :(得分:5)

您应该考虑使用Uri.MakeRelativeUri method - 您当前的算法取决于路径中永远不会包含“/ Content /”的外部文件,这对我来说似乎有风险。 MakeRelativeUri将确定是否可以从当前Uri到srchref建立相对路径,无论您或外部文件存储在路上发生什么变化。

答案 1 :(得分:2)

除非我在这里忽略了这一点,否则如果你更换

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

使用

/$2

你最终会得到

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

这只会发现id“content”,所以在cae中你有一个URL,如:

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

什么都不会被取代

希望它有所帮助,而且我没有错过任何东西。

<强>更新

显然考虑到你正在使用HTML解析器来查找a href中的URL(如果你不是这样的话,你应该这样做: - )

干杯

答案 2 :(得分:0)

那是perl,我不知道c#:

s@(<(img|a)\s[^>]*?\s(src|href)=)(["'])http://[^'"]*?(/Content/[^'"]*?)\4@$1$4$5@g

如果c#具有类似perl的正则表达式,则很容易移植。

答案 3 :(得分: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