Regex pour vérifier si une chaîne est une URL

Comment puis-je vérifier si une chaîne donnée est une adresse URL valide ?

Ma connaissance en matière d’expressions régulières est basique et ne me permet pas de choisir parmi des centaines d’expressions régulières que j’ai déjà vues sur le web.

L’expression régulière: Version JavaScript

/^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|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-z0-9\u00a1-\uffff][a-z0-9\u00a1-\uffff_-]{0,62})?[a-z0-9\u00a1-\uffff]\.)+(?:[a-z\u00a1-\uffff]{2,}\.?))(?::\d{2,5})?(?:[/?#]\S*)?$/

Testez ce regex en ligne.

L’expression régulière: Version PHP

/^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|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-z0-9\x{00a1}-\x{ffff}][a-z0-9\x{00a1}-\x{ffff}_-]{0,62})?[a-z0-9\x{00a1}-\x{ffff}]\.)+(?:[a-z\x{00a1}-\x{ffff}]{2,}\.?))(?::\d{2,5})?(?:[/?#]\S*)?$/

Testez ce regex en ligne.

L’expression régulière pour vérifier si une chaîne est une URL recommandée (et qui a très bien fonctionné pour moi) est la suivante :

/^(ht|f)tp(s?)\:\/\/[0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*(:(0-9)*)*(\/?)([a-zA-Z0-9\-\.\?\,\'\/\\\+&%\$#_]*)?$/

En tant que RegExp JavaScript:

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

Vous pouvez la tester ici:

Il ne s’agit peut-être pas là de faire appel à des expressions régulières, mais plutôt à des méthodes existantes dans le langage que vous avez choisi. Vous souhaiterez probablement utiliser du code existant qui a déjà été écrit, testé et débogué.

  • En PHP, utilisez la fonction « parse_url() ».

  • En Perl : utilisez le Module « URI ».

  • En Ruby : utilisez le Module « URI ».

  • En .NET : utilisez la classe « Uri ».

Les regex ne sont pas une baguette magique que l’on brandit pour résoudre tous les problèmes impliquant des chaînes de caractères.

Cela permet de vérifier tous les URL:

  • avec ou sans http/https
  • avec ou sans www
^(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$

live demo: Tester Regex | Outils en ligne