2013-07-17 83 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); 
}