1

我可以检索网页的文本,比如说https://stackoverflow.com/questions 和一些真实的和虚构的链接:

    /问题
    /标签
    /questions?sort=votes
    /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

有点像浏览器足够聪明地解析链接的方式。

=========================== 更新 - 使用大卫的解决方案:

    '正则表达式匹配所有 <a ... /a> 链接
    Dim myRegEx As New Regex("\<\s*a (?# Find opening <a tag) " & _
                             ".+?href\s*=\s*['""] (?# Then all to href=' or "" ) " & _
                             "(?<href>.*?)['""] (?# Then all to the next ' or "") " & _
                             ".*?\> (?# 然后全部到 > ) " & _
                             "(?<name>.*?)\<\s*/a\s*\> (?# Then all to </a> ) ", _
                             RegexOptions.IgnoreCase 或 _
                             RegexOptions.IgnorePatternWhitespace 或 _
                             正则表达式选项。多行)

    'MatchCollection 保存所有匹配的链接
    将 myMatchCollection 调暗为 MatchCollection
    myMatchCollection = myRegEx.Matches(Me._RawPageText)

    '遍历所有匹配并评估 href 属性的值。
    For i As Integer = 0 To myMatchCollection.Count - 1
        将 thisLink 调暗为 String = ""
        thisLink = myMatchCollection(i).Groups("href").Value()
        '这会检查 Javascript 和 Mailto 链接。
        '这并不完整。还有其他要检查的,我只是还没有遇到过。
        如果 thisLink.ToLower.StartsWith("javascript") 那么
            thisLink = "JAVASCRIPT:" & thisLink
        ElseIf thisLink.ToLower.StartsWith("mailto") Then
            thisLink = "MAILTO:" & thisLink
        别的
            将 baseUri 调暗为新 Uri(Me.URL)

            If Not thisLink.ToLower.StartsWith("http") Then
                '这是一个部分 URL,所以我们假设它是相对于我们的原始 URL
                将 myUri 调暗为新 Uri(baseUri, thisLink)
                thisLink = "相对本地链接:已解决:" & myUri.ToString() & " ORIGINAL: " & thisLink
            别的
                '链接以 HTTP 开头,确定是基本主机的一部分还是在主机之外。
                将 ThisUri 调暗为新的 Uri(thisLink)
                如果 ThisUri.Host.ToLower = baseUri.Host.ToLower Then
                    thisLink = "内部完整链接:" & 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 回答