Я ищу регулярное выражение .NET, извлекающее все URL-адреса с веб-страницы, но не нашел ни одного, достаточно исчерпывающего, чтобы охватить все различные способы указания ссылки.
И побочный вопрос:
Есть ли одно регулярное выражение, чтобы управлять ими всеми? Или мне лучше использовать ряд менее сложных регулярных выражений и просто использовать несколько проходов против необработанного HTML? (Скорость против ремонтопригодности)





Посмотрите на спецификацию URI. Это могло бы вам очень помочь. Что касается производительности, вы можете извлечь почти все HTTP-ссылки на скромной веб-странице. Когда я говорю «скромный», я определенно не имею в виду одну страницу, содержащую все руководства в формате HTML, такие как руководство по ELisp. Также производительность - это щекотливая тема. Я бы посоветовал измерить вашу производительность, а затем решить, собираетесь ли вы извлекать все ссылки, используя одно регулярное выражение или несколько более простых регулярных выражений.
URL-адреса? Как в изображениях / скриптах / css / и т. д.?
%href = "(.["]*)"%
Это захватит URL-адреса из всех тегов, если автор HTML использовал кавычки:
<a[^>]+href = "([^"]+)"[^>]*>
Я сделал пример здесь.
У меня нет времени думать о регулярном выражении, которое, вероятно, не будет работать, но я хотел прокомментировать, что вам определенно следует разбить свое регулярное выражение, по крайней мере, если оно дойдет до этот уровень уродства:
(?:(?:\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*)
(это предположительно соответствует адресам электронной почты)
Обновлено: я даже не могу разместить это на одном посте, это так противно ....
((mailto\:|(news|(ht|f)tp(s?))\://){1}\S+)
Взял с regexlib.com
[примечание редактора: {1} не имеет реальной функции в этом регулярном выражении; посмотреть этот пост]
Все HTTP и MAILTO
(["'])(mailto:|http:).*?
Все ссылки, в том числе относительные, которые вызываются с помощью href или src.
#Matches things in single or double quotes, but not the quotes themselves
(?<=(["']))((?<=href=['"])|(?<=src=['"])).*?(?=)
#Maches thing in either double or single quotes, including the quotes.
(["'])((?<=href = ")|(?<=src = ")).*?
Однако второй даст вам только ссылки, в которых используются двойные кавычки.
С Пакет гибкости 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");
из библиотеки RegexBuddy:
Последний класс символов гарантирует, что если URL-адрес является частью некоторого текста, знаки препинания, такие как запятая или точка после URL-адреса, не интерпретируются как часть URL-адреса.
\b(https?|ftp|file)://[-A-Z0-9+&@#/%?=~_|!:,.;]*[-A-Z0-9+&@#/%=~_|]
согласно http://tools.ietf.org/html/rfc3986
извлечение URL из ЛЮБОГО текста (не только HTML)
(http\://[:/?#\[\]@!%$&'()*+,;=a-zA-Z0-9._\-~]+)
обязательная ссылка на stackoverflow.com/questions/1732348/…