1

Web ページのテキストを取得できます。たとえば、https://stackoverflow.com/questions にいくつかの実際のリンクと作成されたリンクがあるとします。

    /質問
    /タグ
    /questions?sort=投票
    /questions?sort=active
    ランダムページ.aspx
    ../coolhomepage.aspx

元のページがhttps://stackoverflow.com/questionsであることを知っていて、.Net でこれへのリンクを解決する方法はありますか?

    https://stackoverflow.com/questions
    https://stackoverflow.com/tags
    https://stackoverflow.com/questions?sort=votes
    https://stackoverflow.com/questions?sort=active
    https://stackoverflow.com/questions/randompage.aspx
    https://stackoverflow.com/coolhomepage.aspx

ブラウザがリンクを解決するのに十分スマートな方法のようなものです。

=========================== 更新 - David のソリューションを使用:

    'すべての <a ... /a> リンクに一致する正規表現
    Dim myRegEx As New Regex("\<\s*a (?# Find opening <a tag) " & _
                             ".+?href\s*=\s*['""] (?# ではすべて href=' または "" ) " & _
                             "(?<href>.*?)['""] (?# その後、すべて次の ' または "" ) " & _
                             ".*?\> (?# それではすべて > ) " & _
                             "(?<name>.*?)\<\s*/a\s*\> (?# それではすべて </a> ) ", _
                             RegexOptions.IgnoreCase または _
                             RegexOptions.IgnorePatternWhitespace または _
                             RegexOptions.Multiline)

    'マッチしたすべてのリンクを保持するMatchCollection
    myMatchCollection を MatchCollection として暗くする
    myMatchCollection = myRegEx.Matches(Me._RawPageText)

    'すべての一致をループし、href 属性の値を評価します。
    For i As Integer = 0 To myMatchCollection.Count - 1
        thisLink を文字列として暗く = ""
        thisLink = myMatchCollection(i).Groups("href").Value()
        'これは Javascript と Mailto リンクをチェックします。
        「これは完全ではありません。他にも確認すべきことがありますが、まだ遭遇していません。
        If thisLink.ToLower.StartsWith("javascript") Then
            thisLink = "JAVASCRIPT: " & thisLink
        ElseIf thisLink.ToLower.StartsWith("mailto") Then
            thisLink = "MAILTO: " & thisLink
        そうしないと
            Dim baseUri As New URI(Me.URL)

            If Not thisLink.ToLower.StartsWith("http") Then
                'これは部分的な URL であるため、元の URL に対して相対的であると想定します
                Dim myUri As New URI(baseUri, thisLink)
                thisLink = "相対ローカル リンク: 解決済み: " & myUri.ToString() & "オリジナル: " & thisLink
            そうしないと
                'リンクは HTTP で始まり、ベース ホストの一部であるか、ホストの外部にあるかを判断します。
                Dim ThisUri As New URI(thisLink)
                If ThisUri.Host.ToLower = baseUri.Host.ToLower Then
                    thisLink = "INSIDE COMPLETE LINK: " & thisLink
                そうしないと
                    thisLink = "外部リンク: " & thisLink
                終了条件
            終了条件

        終了条件

        '見つかったリンクを Generic.List(Of String) に保存しています
        「このリンクには説明文が追加されています。
        'TODO: 一意の内部リンクのみを保持するコレクションを作成します。
        Me._Links.Add(thisLink)
    次
4

3 に答える 3

2

こんな感じですか?

Uri baseUri = new Uri("http://www.contoso.com");
Uri myUri = new Uri(baseUri, "catalog/shownew.htm");

Console.WriteLine(myUri.ToString());

サンプルはhttp://msdn.microsoft.com/en-us/library/9hst1w91.aspxから入手

于 2009-05-05T22:25:24.853 に答える
1

サーバー側を意味する場合は、次を使用できますResolveUrl()

string url = ResolveUrl("~/questions");
于 2009-05-05T22:19:37.020 に答える
0

このコンテキストでの「解決」の意味がわかりませんが、基本 html 要素を挿入してみてください。ブラウザがそれをどのように処理するかを尋ねたので。

<base>タグは、ページ上のすべてのリンクのデフォルト アドレスまたはデフォルト ターゲットを指定します。」

http://www.w3schools.com/TAGS/tag_base.asp

于 2009-05-05T22:20:52.087 に答える