Регулярное выражение: получение значения URL из гиперссылки - PullRequest
1 голос
/ 12 апреля 2010

У меня есть строка, содержащая HTML. Я хочу получить все значения href из гиперссылок, используя C #.
Целевая строка
<a href="~/abc/cde" rel="new">Link1</a><br> <a href="~/abc/ghq">Link2</a><br>
Я хочу получить значения "~ / abc / cde" и "~ / abc / ghq"

Ответы [ 3 ]

4 голосов
/ 12 апреля 2010

Используйте HTML Agility Pack для анализа HTML. Прямо на их странице примеров у них есть пример парсинга некоторого HTML для значений href:

 foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//a[@href"])
 {
    HtmlAttribute att = link["href"];

    // Do stuff with attribute value
 }
2 голосов
/ 12 апреля 2010

Использование регулярных выражений для разбора HTML не рекомендуется (подумайте о тексте в комментариях и т. Д.).

Тем не менее, следующее регулярное выражение должно сработать, а также при желании даст вам ссылку HTML в теге:

Regex regex = new Regex(@"\<a\s[^\<\>]*?href=(?<quote>['""])(?<href>((?!\k<quote>).)*)\k<quote>[^\>]*\>(?<linkHtml>((?!\</a\s*\>).)*)\</a\s*\>", RegexOptions.IgnoreCase|RegexOptions.ExplicitCapture);
for (Match match = regex.Match(inputHtml); match.Success; match=match.NextMatch()) {
  Console.WriteLine(match.Groups["href"]);
}
1 голос
/ 12 апреля 2010

Вот фрагмент регулярного выражения (используйте опцию IgnoreWhitespace):

(?:<)(?<Tag>[^\s/>]+)       # Extract the tag name.
(?![/>])                    # Stop if /> is found
# -- Extract Attributes Key Value Pairs  --

((?:\s+)             # One to many spaces start the attribute
 (?<Key>[^=]+)       # Name/key of the attribute
 (?:=)               # Equals sign needs to be matched, but not captured.

(?([\x22\x27])              # If quotes are found
  (?:[\x22\x27])
  (?<Value>[^\x22\x27]+)    # Place the value into named Capture
  (?:[\x22\x27])
 |                          # Else no quotes
   (?<Value>[^\s/>]*)       # Place the value into named Capture
 )
)+                  # -- One to many attributes found!

Это даст вам каждый тег, и вы сможете отфильтровать то, что вам нужно, и указать целевой атрибут.

Я написал об этом больше в своем блоге ( C # Regex Linq: извлечение узла HTML с атрибутами различных типов ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...