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

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

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

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

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

RCIX 22.11.2009 12:25
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
17
1
11 330
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

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

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

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-адреса, не интерпретируются как часть URL-адреса.

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

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

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

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

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