Question

Je recherche une expression régulière .NET pour extraire toutes les URL d'une page Web, mais je n'en ai pas trouvé une suffisamment complète pour couvrir toutes les différentes façons dont vous pouvez spécifier un lien.

Et une question secondaire :

Y a-t-il une regex pour les gouverner tous?Ou est-ce que je ferais mieux d'utiliser une série d'expressions régulières moins compliquées et d'utiliser simplement plusieurs passes sur le HTML brut ?(Vitesse vs.maintenabilité)

Était-ce utile?

La solution

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

J'ai pris ça de regexlib.com

[Note de l'éditeur:le {1} n'a pas de fonction réelle dans cette expression régulière ; voir cet article]

Autres conseils

de la bibliothèque RegexBuddy :

URL :Rechercher en texte intégral

La classe de caractères final garantit que si une URL fait partie d'un texte, la ponctuation telle qu'une virgule ou un point après l'URL n'est pas interprétée comme faisant partie de l'URL.

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

Avec Pack d'agilité HTML, vous pouvez utiliser:

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

Regardez la spécification URI.Cela pourrait beaucoup vous aider.Et en ce qui concerne les performances, vous pouvez quasiment extraire tous les liens HTTP dans une modeste page Web.Quand je dis modeste, je ne parle certainement pas d'une seule page englobant tous les manuels HTML comme celui du manuel ELisp.La performance est également un sujet délicat.Mon conseil serait de mesurer vos performances, puis de décider si vous allez extraire tous les liens en utilisant une seule regex ou avec plusieurs expressions regex plus simples.

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

Tous les HTTP et MAILTO

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

Tous les liens, y compris les liens relatifs, appelés par 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

Cependant, le second ne vous fournira que des liens utilisant des guillemets doubles.

Je n'ai pas le temps d'essayer de penser à une regex qui ne fonctionnera probablement pas, mais je voulais dire que vous devriez absolument rompre votre regex, au moins si cela arrive. ce niveau de laideur:

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

(cela correspond censément aux adresses e-mail)

Modifier:Je ne peux même pas le mettre sur un seul post, c'est tellement méchant....

Cela capturera les URL de toutes les balises a tant que l'auteur du code HTML utilisé cite :

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

j'ai fait un exemple ici.

Les URL ?Comme dans images/scripts/css/etc.?

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

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

extraire l'URL de N'IMPORTE QUEL texte (pas seulement HTML)

(http\\://[:/?#\\[\\]@!%$&'()*+,;=a-zA-Z0-9._\\-~]+)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top