Регулярное выражение для анализа гиперссылок и описаний

StackOverflow https://stackoverflow.com/questions/26323

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

<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

Другие советы

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

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

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

Редактировать: (Это работает!)
Теперь я провел свое собственное тестирование и обнаружил, что это работает, я не знаю C #, поэтому не могу дать вам ответ на C #, но я знаю PHP, и вот массив matches, который я получил, запустив его на этом:

<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" } 

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

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

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

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);
}

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top