Regex для разбора гиперссылок и описаний

C #: Что такое хороший Regex для разбора гиперссылок и их описания?

Обратите внимание на нечувствительность к регистру, пробелы и использование одинарных кавычек (вместо двойных) вокруг тега HREF.

Также рассмотрите возможность получения гиперссылок с другими тегами в <a>тегах, таких как <b>и <i>.

25.08.2008 16:05:29
6 ОТВЕТОВ
РЕШЕНИЕ

Пока нет вложенных тегов (и нет разрывов строк), следующий вариант работает хорошо:

<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

6
25.08.2008 16:21:47

Я нашел это, но, очевидно, у этих парней были некоторые проблемы с этим.

Редактировать: (Это работает!)
Теперь я провел собственное тестирование и обнаружил, что это работает, я не знаю 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" } 
1
25.08.2008 16:14:29

У меня есть регулярное выражение, которое обрабатывает большинство случаев, хотя я считаю, что оно соответствует HTML в многострочном комментарии.

Он написан с использованием синтаксиса .NET, но должен легко переводиться.

1
25.08.2008 16:26:44

Посмотрите этот пример из StackOverflow: Регулярное выражение для анализа ссылок с веб-страницы?

Используя HTML Agility Pack, вы можете анализировать html и извлекать подробности, используя семантику HTML вместо сломанного регулярного выражения.

3
23.05.2017 10:27:50
Точно - регулярные выражения хороши, но использование их в HTML или XML - рецепт боли.
slim 19.09.2008 09:15:05
+1 за HTML Agility Pack. Кто-то недавно предложил мне это, и это сработало чудесно.
mpen 10.12.2009 03:25:31

Просто собираюсь выпустить этот фрагмент сейчас, когда он у меня работает ... это менее жадная версия, предложенная ранее. Оригинал не будет работать, если вход имеет несколько гиперссылок. Этот код ниже позволит вам перебрать все гиперссылки:

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);
}
0
12.11.2009 06:08:13

Вот регулярное выражение, которое будет соответствовать сбалансированным тегам.

(?.? "" '[ ""'] *>) (???. (> () | (<- ГЛУБИНА>) |) +) (?! (ГЛУБИНА) ()) (?: )

0
29.11.2009 15:37:25