Вопрос по .net, regex, html – Будет ли это соответствовать URL-адресам, начинающимся с https: // или ftp: //?

14

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

И дополнительный вопрос:

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

обязательная ссылка наstackoverflow.com/questions/1732348/... RCIX

Ваш Ответ

9   ответов
2

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

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

0

http://tools.ietf.org/html/rfc3986

извлечение URL из любого текста (не только HTML)

(http\\://[:/?#\\[\\]@!%
(http\\://[:/?#\\[\\]@!%$&'()*+,;=a-zA-Z0-9._\\-~]+)
amp;'()*+,;=a-zA-Z0-9._\\-~]+)
Будет ли это соответствовать URL-адресам, начинающимся с https: // или ftp: //? andrewsi
11
((mailto\:|(news|(ht|f)tp(s?))\://){1}\S+)

regexlib.com

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

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*)

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

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

0

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

2

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

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

4

С участием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");
Синтаксическая ошибка в строке 5 anonymous coward
8

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

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

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

0

пока автор HTML использует кавычки:

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

Я сделал примерВот.

Похожие вопросы