C#: Что такое хорошее регулярное выражение для анализа гиперссылок и их описания?
Пожалуйста, учитывайте нечувствительность к регистру, пробелы и использование одинарных кавычек (вместо двойных кавычек) вокруг тега HREF.
Также рассмотрите возможность получения гиперссылок с другими тегами в тегах <a>, например <b> и <i>.
Взаимодействие с другими людьми






я нашел это, но, видимо, у эти парни были проблемы с этим.
Обновлено: (Оно работает!)
Я провел собственное тестирование и обнаружил, что он работает, я не знаю C#, поэтому я не могу дать вам ответ на C#, но я знаю PHP, и вот массив совпадений, который я получил после запуска его на этом:
<a href = "pages/index.php" title = "the title">Text</a>
array(3) { [0]=> string(52) "Text" [1]=> string(15) "pages/index.php" [2]=> string(4) "Text" }
Пока нет вложенных тегов (и без разрывов строк), следующий вариант работает хорошо:
<a\s+href=(?:"([^"]+)"|'([^']+)').*?>(.*?)</a>
Как только в игру вступают вложенные теги, регулярные выражения становятся непригодными для синтаксического анализа. Однако вы все равно можете использовать их, применяя более продвинутые функции современных интерпретаторов (в зависимости от вашей машины регулярных выражений). Например. Регулярные выражения .NET используют стек; Я нашел это:
(?:<a.*?href=[""'](?<url>.*?)[""'].*?>)(?<name>(?><a[^<]*>(?<DEPTH>)|</a>(?<-DEPTH>)|.)+)(?(DEPTH)(?!))(?:</a>)
Источник: http://weblogs.asp.net/scottcate/archive/2004/12/13/281955.aspx
Я есть регулярное выражение, который обрабатывает большинство случаев, хотя я считаю, что он соответствует HTML в многострочном комментарии.
Он написан с использованием синтаксиса .NET, но должен легко переводиться.
См. Этот пример из StackOverflow: регулярное выражение для анализа ссылок с веб-страницы?
Используя Пакет HTML Agility, вы можете анализировать html и извлекать детали, используя семантику HTML, вместо сломанного регулярного выражения.
+1 за HTML Agility Pack. Кто-то недавно предложил мне это, и это прекрасно сработало.
Просто собираюсь выбросить этот фрагмент сейчас, когда он у меня работает ... это менее жадная версия одного из предложенных ранее. Оригинал не работал бы, если бы на входе было несколько гиперссылок. Этот код ниже позволит вам перебрать все гиперссылки:
static Regex rHref = new Regex(@"<a.*?href=[""'](?<url>[^""^']+[.]*?)[""'].*?>(?<keywords>[^<]+[.]*?)</a>", RegexOptions.IgnoreCase | RegexOptions.Compiled);
public void ParseHyperlinks(string html)
{
MatchCollection mcHref = rHref.Matches(html);
foreach (Match m in mcHref)
AddKeywordLink(m.Groups["keywords"].Value, m.Groups["url"].Value);
}
Вот регулярное выражение, которое будет соответствовать сбалансированным тегам.
(?: "" '[""']. *?>) (? (?> (?) | (?) |.) +) (? (ГЛУБИНА) (?!)) (? :)
Точно - регулярные выражения - это здорово, но их использование в HTML или XML - рецепт боли.