Le but de cette expression régulière est de contrôler la validité (syntaxique) d'une URL.
Pour celà, nous partons des postulats suivants:

  • une url commence par http, https ou ftp (scheme),
  • elle peut contenir un nom d'utilisateur, et si tel est le cas elle peut aussi contenir un mot de passe,
    • le nom d'utilisateur fait au moins 3 caractères (user),
    • le mot de passe fait au moins 3 caractères et ne peut contenir ni espace ni @ (password),
  • le reste (l'url elle-même) peut contenir tout caractère de mot ainsi que certains caractères particuliers et des / (uri),
  • la casse n'est pas importante (www.g33k-zone.org est identique à wWw.g33k-ZONE.oRg).

Ceci nous donne:

!^
; scheme
(http|https|ftp)
\:\/\/
(
; user
   ([\w\-\.]{3,})
; password
   (\:([^\s@]{3,}))?@
)?
; uri
([\w\.\:\-\/#\?=\~\&]{2,}\/?\b)
$!
 
; version complète
!^(http|https|ftp)\:\/\/(([\w\-\.]{3,})(\:([\S]{3,}))?@)?([\w.:\-\/#\?=\~\&]{2,}\/?\b)$!

Ce masque vérifie que la chaîne envoyée est bien une url, en aucun cas il ne détecte les urls dans une chaîne plus grande. Pour celà, il faut le modifier très simplement en retirant la contrainte de début (^) et de fin ($) et en englobant l'expression entre des parenthèses (pour pouvoir retourner l'intégralité de la chaîne qui correspond).

Ce qui donne:

((http|https|ftp)\:\/\/(([\w\-\.]{3,})(\:([\S]{3,}))?@)?([\w.:\-\/#\?=\~\&]{2,}\/?\b))