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