2008-08-25 82 views
3

C#:解析超鏈接和它們的描述的正則表達式是什麼?解析超鏈接和描述的正則表達式

請考慮HREF標籤周圍的大小寫不敏感,空格和使用單引號(而不是雙引號)。

也請考慮獲取在<a>標記中包含其他標記的超鏈接,例如<b><i>

回答

6

只要沒有嵌套標記(沒有換行符),下面的變形效果很好:

<a\s+href=(?:"([^"]+)"|'([^']+)').*?>(.*?)</a> 

一旦隨着嵌套標籤的進入玩,正則表達式不適合解析。不過,您仍然可以通過應用現代解釋器的更高級功能(取決於您的正則表達式機器)來使用它們。例如。 .NET正則表達式使用堆棧;我發現這一點:

(?:<a.*?href=[""'](?<url>.*?)[""'].*?>)(?<name>(?><a[^<]*>(?<DEPTH>)|</a>(?<-DEPTH>)|.)+)(?(DEPTH)(?!))(?:</a>) 

來源:http://weblogs.asp.net/scottcate/archive/2004/12/13/281955.aspx

1

I found this但顯然these guys有一些問題。

編輯:(它的工作原理!)
我現在已經做了我自己的測試,發現它的作品,我不知道C#,所以我不能給你一個C#的答案,但我知道PHP和這裏的比賽陣列我從運行這樣的事回來:

<a href="pages/index.php" title="the title">Text</a> 

array(3) { [0]=> string(52) "Text" [1]=> string(15) "pages/index.php" [2]=> string(4) "Text" } 
1

have a regex,處理大多數情況下,但我相信它確實多行註釋中匹配的HTML。

它使用.NET語法編寫,但應易於翻譯。

0

只是要把這個片段扔出去,現在我有它的工作..這是一個不太貪婪的版本之前建議的一個。如果輸入有多個超鏈接,原始工作將不起作用。下面的代碼將允許您遍歷所有超鏈接:

static Regex rHref = new Regex(@"<a.*?href=[""'](?<url>[^""^']+[.]*?)[""'].*?>(?<keywords>[^<]+[.]*?)</a>", RegexOptions.IgnoreCase | RegexOptions.Compiled); 
public void ParseHyperlinks(string html) 
{ 
    MatchCollection mcHref = rHref.Matches(html); 

    foreach (Match m in mcHref) 
     AddKeywordLink(m.Groups["keywords"].Value, m.Groups["url"].Value); 
} 
0

這裏是一個正則表達式,它將匹配平衡標籤。 (?(?)(?)|(?< -DEPTH>)。。)+)(?(DEPTH)(?!))????????????????????? )(?:)