2008-08-25 7 views
3

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

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

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

ответ

6

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

<a\s+href=(?:"([^"]+)"|'([^']+)').*?>(.*?)</a> 

Как только когда вложенные теги входят в play, регулярные выражения непригодны для синтаксического анализа. Тем не менее, вы все равно можете использовать их, применяя более сложные функции современных переводчиков (в зависимости от вашей машины регулярных выражений). Например. Регулярные выражения .NET используют стек; Я нашел это:

(?:<a.*?href=[""'](?<url>.*?)[""'].*?>)(?<name>(?><a[^<]*>(?<DEPTH>)|</a>(?<-DEPTH>)|.)+)(?(DEPTH)(?!))(?:</a>) 

Источник: http://weblogs.asp.net/scottcate/archive/2004/12/13/281955.aspx

1

I found this, но, видимо, these guys имел некоторые проблемы с этим.

Edit: (Это работает!)
я теперь сделал свое собственное тестирование и обнаружил, что он работает, я не знаю, 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

Я have a regex, который обрабатывает большинство случаев, хотя я считаю, что это делает матч HTML в многострочный комментарий.

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

3

Смотрите этот пример из StackOverflow: Regular expression for parsing links from a webpage?

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

+0

Точно - регулярные выражения велики, но использование их в HTML или XML - это рецепт боли. – slim 2008-09-19 09:15:05

0

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

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

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

(?: "" '[""']. *?>) (? (?> (?) | (? < -DEPTH>) |.) +) (? (DEPTH) (?!)) (? :)