Regex для разбора гиперссылок и описаний - PullRequest
3 голосов
/ 25 августа 2008

C #: Что такое регулярное выражение для анализа гиперссылок и их описания?

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

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

Ответы [ 6 ]

6 голосов
/ 25 августа 2008

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

<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

3 голосов
/ 19 сентября 2008

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

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

1 голос
/ 25 августа 2008

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

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

1 голос
/ 25 августа 2008

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

Редактировать: (Работает!)
Теперь я провел собственное тестирование и обнаружил, что оно работает, я не знаю 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" } 
0 голосов
/ 29 ноября 2009

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

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

0 голосов
/ 12 ноября 2009

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

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...