Регулярное выражение: абсолютный URL к относительному URL (C #) - PullRequest
1 голос
/ 18 марта 2010

Мне нужно регулярное выражение для запуска строк, подобных приведенной ниже, которые преобразуют абсолютные пути в относительные пути при определенных условиях.

<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 /" I хотел бы получить относительный путь

  • Если URL не содержит "/ Content /", это внешний файл, и абсолютный путь должен остаться

Regex unfortunatley не является моей сильной стороной, и это слишком продвинуто для меня на данный момент. Если кто-то может предложить несколько советов, я буду признателен.

Заранее спасибо.

UPDATE: Чтобы ответить на вопросы в комментариях:

  • Во время применения регулярного выражения все URL-адреса начинаются с "http://"
  • Это следует применять к атрибуту src тегов img и a, а не к тексту вне тегов.

Ответы [ 4 ]

5 голосов
/ 18 марта 2010

Вам следует рассмотреть возможность использования Uri.MakeRelativeUri - ваш текущий алгоритм зависит от внешних файлов, никогда не содержащих "/ Content /" на своем пути, что мне кажется рискованным. MakeRelativeUri определит, можно ли сделать относительный путь от текущего Uri к src или href независимо от изменений, которые вы или внешнее хранилище файлов сделаете в будущем.

2 голосов
/ 18 марта 2010

Если я не пропущу суть здесь, если вы замените

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

С

/$2

В итоге вы получите

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

Это произойдет, только если "контент" найден, поэтому у вас есть URL, например:

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

Ничего не заменит

Надеюсь, это поможет, и я ничего не пропустил.

UPDATE

Очевидно, учитывая, что вы используете анализатор HTML для поиска URL-адреса внутри href (что следует делать, если вы не: -))

Приветствия

0 голосов
/ 20 февраля 2014

Эта функция может преобразовывать все гиперссылки и источники изображений в вашем 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
0 голосов
/ 18 марта 2010

То есть для perl, я не знаю c #:

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

Если c # имеет регулярное выражение, похожее на perl, его будет легко портировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...