Comment puis-je vérifier si une chaîne donnée est une adresse URL valide?
Ma connaissance des expressions régulières est basique et ne me permet pas de choisir parmi les centaines d'expressions régulières que j'ai déjà vues sur le web.
regex
url
language-agnostic
Vitor Silva
la source
la source
Réponses:
J'ai écrit mon modèle d'URL (en fait IRI, internationalisé) pour se conformer à la RFC 3987 ( http://www.faqs.org/rfcs/rfc3987.html ). Ceux-ci sont en syntaxe PCRE.
Pour les IRI absolus (internationalisés):
Pour autoriser également les IRI relatifs:
Comment ils ont été compilés (en PHP):
Edit 7 mars 2011: En raison de la façon dont PHP gère les barres obliques inverses dans les chaînes entre guillemets, celles-ci sont inutilisables par défaut. Vous devrez double-échapper les barres obliques inverses, sauf lorsque la barre oblique inverse a une signification particulière dans l'expression régulière. Vous pouvez le faire de cette façon:
la source
http://com
c'est une URL valide.http://localhost
est, pourquoi les autres mots ne seraient-ils pas? Vous avez raison de dire que leu
modificateur est nécessaire en PHP. Je veux être clair que bien que je les ai générés avec PHP, ils ne sont pas censés être spécifiques à PHP.Je viens de rédiger un article de blog pour une excellente solution pour reconnaître les URL dans les formats les plus utilisés tels que:
www.google.com
http://www.google.com
mailto:[email protected]
[email protected]
www.url-with-querystring.com/?url=has-querystring
L'expression régulière utilisée est:
la source
/((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+(:[0-9]+)?|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)/
width:210px;
etmargin:3px
Quelle plateforme? Si vous utilisez .NET, utilisez
System.Uri.TryCreate
, pas une expression régulière.Par exemple:
(Merci à @Yoshi pour le conseil
javascript:
)la source
javascript: alert('blah')
. Vous devez effectuer une validation supplémentaire sur Uri.Scheme pour confirmer que le protocole http / https / ftp est utilisé, sinon si une telle URL est insérée dans le code HTML de vos pages ASP.NET en tant que lien, vos utilisateurs sont vulnérables aux attaques XSS .Uri.IsWellFormedUriString()
Voici ce que RegexBuddy utilise.
Il correspond à ceux ci-dessous (à l'intérieur des
** **
marques):Vous pouvez télécharger RegexBuddy sur http://www.regexbuddy.com/download.html .
la source
/\b(https?|ftp|file):\/\/[\-A-Za-z0-9+&@#\/%?=~_|!:,.;]*[\-A-Za-z0-9+&@#\/%=~_|]/
En ce qui concerne le message de réponse de la paupière qui se lit "Ceci est basé sur ma lecture de la spécification URI.": Merci Eyelidness, la vôtre est la solution parfaite que j'ai recherchée, car elle est basée sur la spécification URI! Superbe travail. :)
J'ai dû apporter deux amendements. Le premier à obtenir l'expression rationnelle pour correspondre correctement aux URL des adresses IP en PHP (v5.2.10) avec la fonction preg_match ().
J'ai dû ajouter un autre jeu de parenthèses à la ligne au-dessus de "IP Address" autour des tuyaux:
Pas certain de pourquoi.
J'ai également réduit la longueur minimale du domaine de premier niveau de 3 à 2 lettres pour prendre en charge .co.uk et similaire.
Code final:
Cette version modifiée n'a pas été vérifiée par rapport à la spécification URI, donc je ne peux pas garantir sa conformité, elle a été modifiée pour gérer les URL sur les environnements de réseau local et les TLD à deux chiffres ainsi que d'autres types d'URL Web, et pour mieux fonctionner en PHP configuration que j'utilise.
En tant que code PHP :
Voici un programme de test en PHP qui valide une variété d'URL en utilisant l'expression régulière:
Merci encore à la paupière pour l'expression régulière !
la source
')((([a-z0-9][a-z0-9-]*[a-z0-9]\.)*'.
par')((([a-z0-9]\.|[a-z0-9][a-z0-9-]*[a-z0-9]\.)*'.
. " J'ai effectué la modification pertinente sur la base de ce commentaire./^(https?|ftp):
(protocole) Pourquoi interdisez-vous les protocoles tels que données, fichier, svn, dc ++, magnet, skype ou tout autre supporté par un navigateur ayant le plugin correspondant ou un serveur?Mathias Bynens a un excellent article sur la meilleure comparaison d'un grand nombre d'expressions régulières: à la recherche du regex de validation d'URL parfait
Le meilleur posté est un peu long, mais il correspond à peu près à tout ce que vous pouvez y jeter.
Version JavaScript
Version PHP
la source
%^(?:(?:https?|ftp)://)(?:\S+(?::\S*)?@|\d{1,3}(?:\.\d{1,3}){3}|(?:(?:[a-z\d\x{00a1}-\x{ffff}]+-?)*[a-z\d\x{00a1}-\x{ffff}]+)(?:\.(?:[a-z\d\x{00a1}-\x{ffff}]+-?)*[a-z\d\x{00a1}-\x{ffff}]+)*(?:\.[a-z\x{00a1}-\x{ffff}]{2,6}))(?::\d+)?(?:[^\s]*)?$%iu
La publication Obtenir des parties d'une URL (Regex) traite de l'analyse d'une URL pour identifier ses différents composants. Si vous voulez vérifier si une URL est bien formée, elle devrait suffire à vos besoins.
Si vous devez vérifier sa validité, vous devrez éventuellement essayer d'accéder à tout ce qui se trouve à l'autre extrémité.
En général, cependant, vous feriez probablement mieux d'utiliser une fonction qui vous est fournie par votre framework ou une autre bibliothèque. De nombreuses plateformes incluent des fonctions qui analysent les URL. Par exemple, il existe le module urlparse de Python et, dans .NET, vous pouvez utiliser le constructeur de la classe System.Uri comme moyen de valider l'URL.
la source
Ce n'est peut-être pas un travail pour les expressions régulières, mais pour les outils existants dans la langue de votre choix. Vous souhaitez probablement utiliser du code existant qui a déjà été écrit, testé et débogué.
En PHP, utilisez la
parse_url
fonction.Perl:
URI
module .Ruby:
URI
module ..NET: classe 'Uri'
Les regex ne sont pas une baguette magique que vous agitez à chaque problème impliquant des cordes.
la source
java.net.URL
.Analyseur de référence URI non validant
Pour référence, voici la spécification IETF: ( TXT | HTML ). En particulier, l' annexe B. Analyse d' une référence d'URI avec une expression régulière montre comment analyser une expression rationnelle valide . Ceci est décrit comme,
Voici l'expression régulière qu'ils fournissent:
Comme quelqu'un l'a dit, il est probablement préférable de laisser cela à une lib / framework que vous utilisez déjà.
la source
Cela correspondra à toutes les URL
... y compris les sous-domaines et ces nouvelles extensions de nom de domaine de premier niveau telles que. musée ,. académie ,. fondation etc. , qui peuvent contenir jusqu'à 63 caractères (pas seulement. com ,. net ,. information , etc.)
Parce qu'aujourd'hui, la longueur maximale de l'extension de nom de domaine de premier niveau disponible est de 13 caractères tels que. international , vous pouvez remplacer le nombre 63 dans l'expression par 13 pour éviter que quelqu'un en abuse.
comme javascript
Article Wikipédia: Liste de tous les domaines Internet de premier niveau
la source
t.co
. Comment l'ajusteriez-vous pour gérer ces cas?La meilleure expression régulière pour URL serait pour moi:
la source
(([\\w]+:)?//)?(([\\d\\w]|%[a-fA-f\\d]{2,2})+(:([\\d\\w]|%[a-fA-f\\d]{2,2})+)?@)?([\\d\\w][-\\d\\w]{0,253}[\\d\\w]\\.)+[\\w]{2,4}(:[\\d]+)?(/([-+_~.\\d\\w]|%[a-fA-f\\d]{2,2})*)*(\\?(&?([-+_~.\\d\\w]|%[a-fA-f\\d]{2,2})=?)*)?(#([-+_~.\\d\\w]|%[a-fA-f\\d]{2,2})*)?
\w
avec\p{L}
au minimum.([\d\w][-\d\w]{0,253}[\d\w]\.)+
en([\d\w][-\d\w]{0,253}[\d\w]?\.)+
(ajouter un point d'interrogation vers la fin)Correspond à http://site.com/dir/file.php?var=moo | ftp: // utilisateur: [email protected]: 21 / fichier / dir
Non-matchs site.com | http://site.com/dir//
la source
http://www.goo gle.com
correspondra.Correspond à http://www.asdah.com/~joe | ftp://ftp.asdah.co.uk:2828/asdah%20asdah.gif | https://asdah.gov/asdh-ah.as
la source
Je n'ai pas pu trouver l'expression régulière que je cherchais, j'ai donc modifié une expression régulière pour répondre à mes besoins, et il semble que cela fonctionne bien maintenant. Mes exigences étaient:
Voici ce que j'ai trouvé, toute suggestion est appréciée:
la source
Si vous recherchez vraiment le match ultime , vous le trouverez probablement sur " A Good Url Regular Expression? ".
Mais une expression régulière qui correspond vraiment à tous les domaines possibles et permet tout ce qui est autorisé selon les RFC est horriblement longue et illisible, croyez-moi ;-)
la source
J'ai travaillé sur un article détaillé sur la validation d'URI à l'aide d'expressions régulières. Il est basé sur RFC3986.
Validation d'URI d'expression régulière
Bien que l'article ne soit pas encore terminé, j'ai mis au point une fonction PHP qui fait un très bon travail de validation des URL HTTP et FTP. Voici la version actuelle:
Cette fonction utilise deux expressions rationnelles; un pour correspondre à un sous-ensemble d'URI génériques valides (absolus ayant un hôte non vide) et un second pour valider le nom d'hôte DNS "parties séparées par des points". Bien que cette fonction ne valide actuellement que les schémas HTTP et FTP, elle est structurée de manière à pouvoir être facilement étendue pour gérer d'autres schémas.
la source
j'ai écrit une petite version groovy que vous pouvez exécuter
il correspond aux URL suivantes (ce qui est assez bon pour moi)
http://google.com
http://google.com/help.php
http://google.com/help.php?a=5
http://www.google.com
http://www.google.com/help.php
http://www.google.com?a=5
google.com?a=5
google.com/help.php
google.com/help.php?a=5
http://www.m.google.com/help.php?a=5 (et toutes ses permutations)
www.m.google.com/help.php?a=5 (et toutes ses permutations)
m.google.com/help.php?a=5 (et toutes ses permutations)
La chose importante pour toutes les URL qui ne commencent pas par http ou www est qu'elles doivent inclure un / ou?
Je parie que cela peut être modifié un peu plus, mais il fait le travail assez bien pour être si court et compact ... parce que vous pouvez à peu près le diviser en 3:
trouver tout ce qui commence par http: https?: // w {0,3} \ w *?. \ w {2,3} \ S *
trouver tout ce qui commence par www: www. \ w *?. \ w {2,3} \ S *
ou trouver quelque chose qui doit avoir un texte puis un point puis au moins 2 lettres et puis un? ou /: \ w *?. \ w {2,3} [/ \?] \ S *
la source
-
URL.J'utilise cette expression régulière:
Pour soutenir les deux:
Et:
la source
((https?:)?(\/?\/))(([\d\w]|%[a-fA-f\d]{2,2})+(:([\d\w]|%[a-fA-f\d]{2,2})+)?@)?([\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,63}(:[\d]+)?(/([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(&?([-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?
((?:https?:)?(?:\/?\/))((?:[\d\w]|%[a-fA-f\d]{2,2})+(?::(?:[\d\w]|%[a-fA-f\d]{2,2})+)?@)?((?:[\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,63})(:[\d]+)?(\/(?:[-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(?:&?(?:[-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#(?:[-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?
Voici une bonne règle qui couvre tous les cas possibles: ports, paramètres, etc.
la source
Celui-ci fonctionne très bien pour moi.
(https?|ftp)://(www\d?|[a-zA-Z0-9]+)?\.[a-zA-Z0-9-]+(\:|\.)([a-zA-Z0-9.]+|(\d+)?)([/?:].*)?
la source
Voici une version Java prête à l'emploi à partir du code source Android. C'est le meilleur que j'ai trouvé.
la source
Voici une regex que j'ai faite qui extrait les différentes parties d'une URL:
^((?:https?|ftp):\/\/?)?([^:/\s.]+\.[^:/\s]|localhost)(:\d+)?((?:\/\w+)*\/)?([\w\-.]+[^#?\s]+)?([^#]+)?(#[\w-]+)?$
((?:https?|ftp):\/\/?)?
(groupe 1) : extrait le protocole([^:/\s.]+\.[^:/\s]|localhost)
(groupe 2) : extrait le nom d'hôte(:\d+)?
(groupe 3) : extrait le numéro de port((?:\/\w+)*\/)?([\w\-.]+[^#?\s]+)?
(groupes 4 et 5) : extrait la partie chemin([^#]+)?
(groupe 6) : extrait la partie requête(#[\w-]+)?
(groupe 7) : extrait la partie de hachagePour chaque partie de l'expression régulière répertoriée ci-dessus, vous pouvez supprimer la fin
?
pour la forcer (ou en ajouter une pour la rendre facultative). Vous pouvez également supprimer le^
au début et$
à la fin de l'expression régulière afin qu'il ne soit pas nécessaire de faire correspondre la chaîne entière.Voir sur regex101 .
Remarque: ce regex n'est pas sûr à 100% et peut accepter certaines chaînes qui ne sont pas nécessairement des URL valides mais il valide en effet certains critères. Son objectif principal était d'extraire les différentes parties d'une URL et non de la valider.
la source
Pour Python, il s'agit de l'URL de validation d'URL réelle utilisée dans Django 1.5.1:
Cela fait à la fois les adresses ipv4 et ipv6 ainsi que les ports et les paramètres GET.
Trouvé dans le code ici , ligne 44.
la source
J'ai trouvé le Regex suivant pour les URL, testé avec succès avec plus de 500 URL :
/\b(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)?@)?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\x{00a1}-\x{ffff}0-9]+-?)*[a-z\x{00a1}-\x{ffff}0-9]+)(?:\.(?:[a-z\x{00a1}-\x{ffff}0-9]+-?)*[a-z\x{00a1}-\x{ffff}0-9]+)*(?:\.(?:[a-z\x{00a1}-\x{ffff}]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?\b/gi
Je sais que ça a l'air moche, mais la bonne chose c'est que ça marche. :)
Explication et démo avec 581 URL aléatoires sur regex101.
Source: À la recherche du regex de validation d'URL parfait
la source
/(https?):\/\/([\w-]+(\.[\\w-]+)*\.([a-z]+))(([\w.,@?^=%&:\/~+#()!-]*)([\w@?^=%&\/~+#()!-]))?/gi
J'ai essayé de formuler ma version d'url. Mon exigence était de capturer des instances dans une chaîne où l'url possible peut être cse.uom.ac.mu - notant qu'elle n'est pas précédée de http ni www
la source
ht{2}ps?
plutôthttps?
qu'est-ce qui ne va pas avec FILTER_VALIDATE_URL clair et simple?
Je sais que ce n'est pas exactement la question, mais cela a fait le travail pour moi lorsque je devais valider les URL, donc j'ai pensé que cela pourrait être utile à ceux qui rencontrent ce message à la recherche de la même chose
la source
Le RegEx suivant fonctionnera:
la source
Utilisez celui-ci son travail pour moi
la source
Pour plus de commodité, voici une expression rationnelle à une ligne pour les URL qui correspondra également à localhost où vous êtes plus susceptible d'avoir des ports que
.com
ou similaire.la source
Vous ne spécifiez pas la langue que vous utilisez. Si PHP l'est, il existe une fonction native pour cela:
Renvoie les données filtrées ou FALSE si le filtre échoue.
Vérifiez-le ici >>
J'espère que cela aide.
la source