Domanda

Sto cercando un'espressione regolare .NET per estrarre tutti gli URL da una pagina Web, ma non ne ho trovata una sufficientemente completa da coprire tutti i diversi modi in cui è possibile specificare un collegamento.

E una domanda a margine:

È lì una regex per governarli tutti?O è meglio usare una serie di espressioni regolari meno complicate e usare semplicemente più passaggi rispetto all'HTML grezzo?(Velocità vs.Manutenibilità)

È stato utile?

Soluzione

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

Ho preso questo da regexlib.com

[nota dell'editore:il {1} ​​non ha una vera funzione in questa regex; vedere questo post]

Altri suggerimenti

dalla libreria RegexBuddy:

URL:Trova nel testo completo

La classe di caratteri finale garantisce che se un URL fa parte di testo, la punteggiatura come una virgola o un punto dopo l'URL non venga interpretata come parte dell'URL.

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

Con Pacchetto di agilità HTML, Puoi usare:

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

Guarda le specifiche dell'URI.Questo potrebbe aiutarti molto.E per quanto riguarda le prestazioni, puoi praticamente estrarre tutti i collegamenti HTTP in una pagina web modesta.Quando dico modesto non intendo assolutamente una pagina che comprenda tutti i manuali HTML come quello del manuale ELisp.Anche le prestazioni sono un argomento delicato.Il mio consiglio sarebbe di misurare le tue prestazioni e poi decidere se estrarre tutti i collegamenti utilizzando una singola regex o con più espressioni regex più semplici.

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

Tutti gli HTTP e MAILTO

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

Tutti i collegamenti, compresi quelli relativi, chiamati da href o 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

Il secondo, tuttavia, ti fornirà solo collegamenti che utilizzano virgolette doppie.

Non ho tempo per provare a pensare a una regex che probabilmente non funzionerà, ma volevo commentare che dovresti assolutamente interrompere la tua regex, almeno se arriva a questo livello di bruttezza:

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

(questo presumibilmente corrisponde agli indirizzi email)

Modificare:Non riesco nemmeno a inserirlo in un post, è così brutto....

Ciò catturerà gli URL da tutti i tag purché l'autore dell'HTML abbia utilizzato le virgolette:

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

Ho fatto un esempio Qui.

URL?Come in immagini/script/css/ecc.?

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

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

estrarre l'URL da QUALSIASI testo (non solo HTML)

(http\\://[:/?#\\[\\]@!%$&'()*+,;=a-zA-Z0-9._\\-~]+)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top