【问题标题】:Regex: absolute url to relative url (C#)正则表达式:绝对 url 到相对 url (C#)
【发布时间】:2011-01-29 03:21:32
【问题描述】:

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

<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 包含“/Content/”我 想获取相对路径

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

不幸的是,Regex 不是我的强项,目前这对我来说太先进了。如果有人能提供一些建议,我将不胜感激。

提前致谢。

更新: 回答 cmets 中的问题:

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

【问题讨论】:

  • 问题:所有的 url 都是绝对绝对的,即带有 http:// 或 ftp:// 之类的?
  • 你只想改变img标签的src属性?

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


【解决方案1】:

您应该考虑使用Uri.MakeRelativeUri method - 您当前的算法依赖于在其路径中从不包含“/Content/”的外部文件,这对我来说似乎有风险。 MakeRelativeUri 将确定是否可以创建从当前 Uri 到 srchref 的相对路径,而不管您或外部文件存储在路上所做的更改。

【讨论】:

  • 这个问题真的不是正则表达式的工作。此答案中的方法将提供明显更可靠的结果,并且更易于编写和理解。
  • 我很欣赏这里的建议。我不知道这种方法,并且完全同意正则表达式解决方案所涉及的风险。我会检查一下,很可能会接受这个答案。
【解决方案2】:

除非我错过了这里的重点,如果你替换

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

/$2

你最终会得到

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

这只会发生 id "content" 被发现,所以你有一个 URL,例如:

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

什么都不会被替换

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

更新

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

干杯

【讨论】:

    【解决方案3】:

    那是给perl的,我不懂c#:

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

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

    【讨论】:

    • 绝对是更有效的方法。
    • 你可以写得更简单(假设作者不使用 HTML 解析器)?
    【解决方案4】:

    此功能可以将 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-13
      • 1970-01-01
      • 1970-01-01
      • 2011-11-24
      • 2011-03-27
      相关资源
      最近更新 更多