Je sais que c'est un peu un vieux post, mais il manque à toutes les expressions régulières ici un élément très important: le support des noms de domaine IDN.
Les noms de domaine IDN commencent par xn--. Ils activent les caractères UTF-8 étendus dans les noms de domaine. Par exemple, saviez-vous que «♡ .com» est un nom de domaine valide? Ouais, "love heart dot com"! Pour valider le nom de domaine, vous devez laisser http://xn--c6h.com/ passer la validation.
Notez que pour utiliser cette expression régulière, vous devrez convertir le domaine en minuscules et également utiliser une bibliothèque IDN pour vous assurer d'encoder les noms de domaine en ACE (également connu sous le nom de «codage compatible ASCII»). Une bonne bibliothèque est GNU-Libidn.
idn (1) est l'interface de ligne de commande vers la bibliothèque de noms de domaine internationalisée. L'exemple suivant convertit le nom d'hôte en UTF-8 en encodage ACE. L'URL résultante https: //nic.xn--flw351e/ peut ensuite être utilisée comme équivalent codé ACE de https: // nic. 谷 歌 / .
$ idn --quiet -a nic.谷歌
nic.xn--flw351e
Cette expression régulière magique devrait couvrir la plupart des domaines (même si je suis sûr qu'il existe de nombreux cas limites valides que j'ai manqués):
^((?!-))(xn--)?[a-z0-9][a-z0-9-_]{0,61}[a-z0-9]{0,1}\.(xn--)?([a-z0-9\-]{1,61}|[a-z0-9-]{1,30}\.[a-z]{2,})$
Lorsque vous choisissez une expression régulière de validation de domaine, vous devriez voir si le domaine correspond à ce qui suit:
- xn--stackoverflow.com
- stackoverflow.xn - com
- stackoverflow.co.uk
Si ces trois domaines ne passent pas, votre expression régulière n'autorise peut-être pas les domaines légitimes!
Consultez la page de prise en charge des noms de domaine internationalisés du guide Oracle's International Language Environment Guide pour plus d'informations.
N'hésitez pas à essayer la regex ici: http://www.regexr.com/3abjr
L'ICANN conserve une liste des noms de domaine qui ont été délégués et qui peut être utilisée pour voir quelques exemples de domaines IDN.
Éditer:
^(((?!-))(xn--|_{1,1})?[a-z0-9-]{0,61}[a-z0-9]{1,1}\.)*(xn--)?([a-z0-9][a-z0-9\-]{0,60}|[a-z0-9-]{1,30}\.[a-z]{2,})$
Cette expression régulière arrêtera les domaines qui ont «-» à la fin d'un nom d'hôte comme étant marqués comme valides. De plus, il autorise un nombre illimité de sous-domaines.