2013-07-17 2 views
0

В приложении C# я хочу сопоставить каждый тег HTML-шрифта с атрибутом «color».Соответствующие вложенные 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> 

Как я могу получить MatchCollection, я хочу использовать C#?

Спасибо.

+3

Ваше регулярное выражение соответствует ничего, и все в одну группу. Вы должны знать, что регулярные выражения не очень хороши для таких вложенных вещей. У вас было бы намного проще (и более чистое) время использовать что-то вроде HtmlAgilityPack для его анализа. –

+3

Вместо этого вы должны использовать HtmlAgilityPack. http://htmlagilitypack.codeplex.com – Matthew

+0

Спасибо! Я попробую! : P – anpep

ответ

1

Regex on "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 Agility обновления и запроса 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); 
} 
Смежные вопросы