2013-07-17 81 views
0

在C#應用程序中,我希望將每個HTML「字體」標籤與「顏色」屬性匹配。匹配嵌套的HTML標籤

我有以下文字:

1<font color="red">2<font color="blue">3</font>4</font>56 

而且我要包含以下項目一MatchCollection:

[0] <font color="red">234</font> 
[1] <font color="blue">3</font> 

但是,當我使用此代碼:

Regex.Matches(result, "<font color=\"(.*)\">(.*)</font>"); 

的MatchCollection我得到的是以下內容:

[0] <font color="red">2<font color="blue">3</font>4</font> 

如何獲得我想用C#的MatchCollection?

謝謝。

+3

你的正則表達式匹配任何東西,一切都變成一個組。你應該知道正則表達式對嵌套的東西不是很好。用HtmlAgilityPack之類的東西解析它會讓你更容易(更清潔)。 –

+3

您應該改用HtmlAgilityPack。 http://htmlagilitypack.codeplex.com – Matthew

+0

謝謝!我會嘗試! :P – anpep

回答

1

「HTML」上的正則表達式是反模式。只是不要這樣做。

要引導你在正確的道路上,看你可以用HTML Agility Pack做什麼:現在

HtmlDocument doc = new HtmlDocument(); 
doc.LoadHtml(@"1<font color=""red"">2<font color=""blue"">3</font>4</font>56"); 
var fontElements = doc.DocumentNode.Descendants("font"); 
var newNodes = fontElements.Select(fe => { 
    var newNode = fe.Clone(); 
    newNode.InnerHtml = fe.InnerText; 
    return newNode; 
}); 
var collection = newNodes.Select(n => n.OuterHtml); 

,在collection我們有以下字符串:

<font color="red">234</font> 
<font color="blue">3</font> 

嗯...可愛。

+0

不錯!謝謝!它解決了我的問題! :d – anpep

0
Matches m = Regex.Matches(result, "<font color=\"(.*?)\">(.*?)</font>"); 
//add a ? after the * and print the result .you will know how to get it. 
+0

使用您的代碼,我在MatchCollection中獲得一個具有以下值的項目: fa sdfg anpep

+0

不,你使用vs2010可以調試它並跟蹤變量m。 –

+1

沒關係。感謝@spender,我使用HttpAgilityPack解決了這個問題:D – anpep

0

使用HTML敏捷性包和XPath查詢的一種方式,以確保色彩屬性存在:

HtmlDocument htmlDoc = new HtmlDocument(); 
htmlDoc.OptionFixNestedTags = true; 
String html = "1<font color=\"red\">2<font color=\"blue\">3</font>4</font>56"; 
htmlDoc.LoadHtml(html); 
HtmlNodeCollection fontTags = htmlDoc.DocumentNode.SelectNodes(".//font[@color]"); 
foreach (HtmlNode fontTag in fontTags) 
{ 
    Console.WriteLine(fontTag.InnerText); 
}