Вот 2 подхода с использованием LINQ to XML и regex. Хотя некоторые люди недовольны анализом HTML с помощью регулярных выражений, в этом конкретном случае нет вложенных элементов, поэтому это разумное решение. LINQ to XML будет работать, только если ваш HTML правильно сформирован. В противном случае взгляните на HTML Agility Pack .
РЕДАКТИРОВАТЬ: для вашего образца Elements()
работает с LINQ to XML. Однако, если у вас много вложенных тегов HTML, вы можете использовать Descendants()
, чтобы достичь всех желаемых тегов.
string input = @"<p>This is some html text. my favourite website is <a href=""http://www.google.com"">google</a> and my favourite help site is <a href=""http://www.stackoverflow.com"">stackoverflow</a> and i check my email at <a href=""http://www.gmail.com"">gmail</a>. the url to my site is http://www.mysite.com. <img src=""http://www.someserver.com/someimage.jpg"" alt=""""/></p>";
var xml = XElement.Parse(input);
var result = xml.Elements()
.Where(e => e.Name == "img" || e.Name == "a")
.Select(e => e.Name == "img" ?
e.Attribute("src").Value : e.Attribute("href").Value);
foreach (string item in result)
{
Console.WriteLine(item);
}
string pattern = @"<(?:a|img).+?(?:href|src)=""(?<Url>.+?)"".*?>";
foreach (Match m in Regex.Matches(input, pattern))
{
Console.WriteLine(m.Groups["Url"].Value);
}
РЕДАКТИРОВАТЬ # 2: в ответ на ваше обновление о RegexBuddy, я хотел бы указать на инструмент, который я использую. Expresso - хороший бесплатный инструмент (только регистрация по электронной почте, но она бесплатная). Автор также написал 30-минутное руководство по регулярным выражениям , которое вы можете использовать, чтобы следовать ему, и включено в файл справки Expresso.