Pergunta

Estou procurando uma expressão regular .NET para extrair todos os URLs de uma página da Web, mas não encontrei uma que fosse abrangente o suficiente para cobrir todas as diferentes maneiras de especificar um link.

E uma pergunta paralela:

Existe um regex para governar todos eles?Ou é melhor usar uma série de expressões regulares menos complicadas e apenas usar várias passagens no HTML bruto?(Velocidade vs.Capacidade de manutenção)

Foi útil?

Solução

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

Eu tirei isso de regexlib. com

[Nota do editor:o {1} não tem função real neste regex; veja esta postagem]

Outras dicas

da biblioteca RegexBuddy:

URL:Encontre no texto completo

A classe de caracteres final garante que, se um URL fizer parte de algum texto, a pontuação, como vírgula ou ponto final após o URL, não será interpretada como parte do URL.

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

Com Pacote de agilidade HTML, você pode usar:

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");

Veja a especificação do URI.Isso pode te ajudar muito.E no que diz respeito ao desempenho, você pode extrair praticamente todos os links HTTP em uma página web modesta.Quando digo modesto, definitivamente não me refiro a uma página que abrange todos os manuais HTML, como o manual do ELisp.Além disso, o desempenho é um tema delicado.Meu conselho seria medir seu desempenho e então decidir se você vai extrair todos os links usando um único regex ou com múltiplas expressões regex mais simples.

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

Todos os HTTP e MAILTO

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

Todos os links, inclusive os relativos, chamados por href ou 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

No entanto, o segundo só fornecerá links que usam aspas duplas.

Não tenho tempo para tentar pensar em uma regex que provavelmente não funcionará, mas gostaria de comentar que você definitivamente deveria desmembrar sua regex, pelo menos se chegar a esse nível de feiúra:

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

(isso supostamente corresponde aos endereços de e-mail)

Editar:Não consigo nem colocar isso em um post, é tão desagradável....

Isso capturará os URLs de todas as tags, desde que o autor do HTML usado aspas:

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

Eu fiz um exemplo aqui.

URLs?Como em imagens/scripts/css/etc.?

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

de acordo com http://tools.ietf.org/html/rfc3986

extraindo URL de QUALQUER texto (não apenas HTML)

(http\\://[:/?#\\[\\]@!%$&'()*+,;=a-zA-Z0-9._\\-~]+)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top