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

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

  •  08-06-2019
  •  | 
  •  

Вопрос

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

И еще один побочный вопрос:

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

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

Решение

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

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

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

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

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

URL- АДРЕС:Найти в полном тексте

Класс final character гарантирует, что если URL-адрес является частью некоторого текста, знаки препинания, такие как запятая или точка после URL-адреса, не интерпретируются как часть URL-адреса.

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

С Html-пакет Гибкости, вы можете использовать:

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

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

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

Все 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

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

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

(?:(?:\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*)

(предположительно, это соответствует адресам электронной почты)

Редактировать:Я даже не могу вместить это в один пост, настолько это противно....

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

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

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

URL-адреса?Как в изображениях / скриптах / css / etc.?

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

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

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

(http\\://[:/?#\\[\\]@!%$&'()*+,;=a-zA-Z0-9._\\-~]+)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top