Регулярное выражение для разбора ссылок с веб-страницы?

Я ищу регулярное выражение .NET. Извлеките все URL-адреса с веб-страницы, но не нашли их достаточно всеобъемлющими, чтобы охватить все различные способы указания ссылки.

И побочный вопрос:

Существует ли одно регулярное выражение для их всех? Или мне лучше использовать серию менее сложных регулярных выражений и просто использовать mutliple pass против необработанного HTML? (Скорость против ремонтопригодности)

Ответы

Ответ 1

((mailto\:|(news|(ht|f)tp(s?))\://){1}\S+)

Я взял это с regexlib.com

[примечание редактора: {1} не имеет реальной функции в этом регулярном выражении; смотри этот пост ]

Ответ 2

из библиотеки RegexBuddy:

URL: Найти в полном тексте

Окончательный класс символов гарантирует, что если URL-адрес является частью некоторого текста, пунктуация, такая как запятая или полная остановка после URL-адреса, не интерпретируется как часть URL-адреса.

\b(https?|ftp|file)://[-A-Z0-9+&@#/%?=~_|!:,.;]*[-A-Z0-9+&@#/%=~_|]

Ответ 3

С Html Agility Pack вы можете использовать:

HtmlDocument doc = new HtmlDocument();
doc.Load("file.htm");
foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//[email protected]")
{
Response.Write(link["href"].Value);
}
doc.Save("file.htm");

Ответ 4

Посмотрите на спецификацию URI. Это может помочь вам. Что касается производительности, вы можете в значительной степени извлечь все HTTP-ссылки на скромной веб-странице. Когда я говорю "скромный", я определенно не имею в виду одну страницу, охватывающую HTML-руководства, подобные руководству ELisp. Также производительность - это очень трогательная тема. Моим советом было бы измерить вашу производительность, а затем решить, будете ли вы извлекать все ссылки, используя одно единственное регулярное выражение или несколько более простых выражений регулярных выражений.

http://gbiv.com/protocols/uri/rfc/rfc3986.html

Ответ 5

Все HTTP и MAILTO

(["'])(mailto:|http:).*?\1

Все ссылки, включая относительные, вызываемые href или src.

#Matches things in single or double quotes, but not the quotes themselves
(?<=(["']))((?<=href=['"])|(?<=src=['"])).*?(?=\1)

#Maches thing in either double or single quotes, including the quotes.
(["'])((?<=href=")|(?<=src=")).*?\1

Во-вторых, вы получите только ссылки, которые используют двойные кавычки.

Ответ 6

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

(?:(?:\r\n)?[ \t])*(?:(?:(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t]
)+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:
\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(
?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ 
\t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\0
....*SNIP*....
*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])
+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\
.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z
|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*\>(?:(
?:\r\n)?[ \t])*))*)?;\s*)

(это якобы соответствует адресам электронной почты)

Изменить: я не могу даже поместиться на одном посту, это так противно.

Ответ 7

URL,? Как в images/scripts/css/etc.?

%href="(.["]*)"%

Ответ 8

Это приведет к захвату URL-адресов из всех тегов, если автор используемых котировок HTML:

<a[^>]+href="([^"]+)"[^>]*>

Я привел пример здесь.

Ответ 9

согласно http://tools.ietf.org/html/rfc3986

извлечение url из ЛЮБОГО текста (не только HTML)

(http\\://[:/?#\\[\\]@!%$&'()*+,;=a-zA-Z0-9._\\-~]+)