Espressione regolare per l'analisi dei collegamenti da una pagina Web?
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à)
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.
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._\\-~]+)