142 votes

Quelle est une expression régulière qui correspond à un nom de domaine valide sans sous-domaine ?

J'ai besoin de valider un nom de domaine :

google.com

stackoverflow.com

Ainsi, un domaine dans sa forme la plus brute - même pas un sous-domaine comme www.

  1. Les caractères ne doivent être a-z | A-Z | 0-9 et période (.) et tableau de bord (-)
  2. Le nom de domaine ne doit pas commencer ou se terminer par un tiret (-). (par exemple, -google-.com)
  3. Le nom de domaine doit comporter entre 1 et 63 caractères.
  4. L'extension (TLD) peut être n'importe quoi selon les règles du #1 pour l'instant, je pourrais les valider par rapport à une liste plus tard, elle devrait être de 1 ou plusieurs caractères cependant.

Edit : TLD est apparemment de 2 à 6 personnages en l'état actuel des choses.

n°. 4 révisé : Le TLD devrait en fait être étiqueté "sous-domaine" car il devrait inclure des choses comme .co.uk -- J'imagine que la seule validation possible (à part la vérification par rapport à une liste) serait "après le premier point, il devrait y avoir un ou plusieurs caractères selon les règles #1".

Merci beaucoup, croyez-moi, j'ai essayé !

0 votes

Il serait judicieux d'envisager la validation des URI plutôt que celle des noms de domaine. Consultez le document IETF RFC3986.

1 votes

Peut ne pas être utile du tout. Pour ce qui est de google.co.uk et de certains domaines japonais, je suis sûr que vous devrez réfléchir à deux fois avant d'utiliser des expressions rationnelles. Je pense personnellement que l'expression géographique n'est pas suffisante pour valider un domaine par rapport à un domaine réel. Pour votre information, voici une liste presque complète des tlds et des codes pays des domaines de second niveau : statique.ayesh.me/misc/SO/tlds.txt

2 votes

Voir ma réponse à la question connexe sur validation du nom d'hôte .

60voto

Cameron Points 32208

Eh bien, c'est assez simple un peu plus sournois qu'il n'y paraît (voir commentaires), compte tenu de vos exigences spécifiques :

/^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\.[a-zA-Z]{2,}$/

Mais notez que cela rejettera un grand nombre de domaines valides.

0 votes

Merci, celui-ci semble fonctionner. Quel genre de domaines ne passe pas la validation, vous connaissez ?

0 votes

@infensus : Eh bien, tout ce qui est lié à des composants d'URL principaux (par ex. http://example.com ou user:pass@example.com ), même si, pour être honnête, cela ne fait pas partie du domaine. Les domaines plus longs ne sont pas pris en compte. Mais surtout, les domaines contenant des sous-domaines ne sont pas pris en compte.

0 votes

.museum est plus long que 4 caractères. Et l'OP dit qu'il n'a qu'une seule règle pour les tlds.

51voto

paka Points 719

Mon RegEx est le suivant :

^[a-zA-Z0-9][a-zA-Z0-9-_]{0,61}[a-zA-Z0-9]{0,1}\.([a-zA-Z]{1,6}|[a-zA-Z0-9-]{1,30}\.[a-zA-Z]{2,3})$

c'est bon pour i.oh1.me et pour wow.british-library.uk

UPD

Voici la règle mise à jour

^(([a-zA-Z]{1})|([a-zA-Z]{1}[a-zA-Z]{1})|([a-zA-Z]{1}[0-9]{1})|([0-9]{1}[a-zA-Z]{1})|([a-zA-Z0-9][a-zA-Z0-9-_]{1,61}[a-zA-Z0-9]))\.([a-zA-Z]{2,6}|[a-zA-Z0-9-]{2,30}\.[a-zA-Z]{2,3})$

Regular expression visualization

https://www.debuggex.com/r/y4Xe_hDVO11bv1DV

maintenant il vérifie - ou _ au début ou à la fin de l'étiquette du domaine.

9 votes

Ça a l'air plutôt bien, mais le {2,6} devront être mis à jour pour le nouveau TLD. Probablement {2,} .

0 votes

@jwatts1980 y a-t-il des exemples de telles zones ? ou vous voulez dire des zones futures possibles ?

1 votes

Voici un article qui traite des changements à venir, avec des exemples et des liens vers des ressources connexes : zdnet.com/

15voto

mkyong Points 603

La réponse acceptée ne fonctionne pas pour moi, essayez ceci :

^((?!-)[A-Za-z0-9-]{1,63}(?<!-) \. )+[A-Za-z]{2,6}$.

Visitez ce site Cas de test unitaires pour la validation.

4 votes

Pas de support pour les nouveaux noms de TLD plus longs comme .audio, .photography, et la plupart de ces... données.iana.org/TLD/tlds-alpha-by-domain.txt

0 votes

@mrbinky3000 Changez juste le dernier. {2,6} à quelque chose d'autre et ça marchera. Le mien : ^((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+(?!-)[a-zA-Z0-9-]{1,63}(?‌​<!-)$

0 votes

@Mygod votre regex contient des déchets de largeur zéro après le dernier point d'interrogation, donc n'importe qui le copiant sera désagréablement surpris.

14voto

ahadinyoto Points 89

Juste une petite correction - la dernière partie devrait être jusqu'à 6. D'où,

^[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,6}$

Le TLD le plus long est museum (6 caractères) - http://en.wikipedia.org/wiki/List_of_Internet_top-level_domains

3 votes

Note : Ceci ne passera pas le nom de domaine valide (mais rare) www.my---domain.com.

17 votes

Cela ne suffit pas pour les nouveaux TLD, par exemple. .photography

2 votes

@SamFigueroa Vous devrez juste modifier la longueur de celui-ci.

5voto

zaTricky Points 61

Je n'ai pas encore assez d'expérience pour commenter. En réponse à la solution de paka, j'ai constaté que je devais ajuster trois éléments :

  • Le tiret et le trait de soulignement ont été déplacés car le tiret est interprété comme un intervalle (comme dans "0-9").
  • Ajout d'un point pour les noms de domaine avec de nombreux sous-domaines
  • extension de la longueur potentielle des TLD à 13 ans

Avant :

^(([a-zA-Z]{1})|([a-zA-Z]{1}[a-zA-Z]{1})|([a-zA-Z]{1}[0-9]{1})|([0-9]{1}[a-zA-Z]{1})|([a-zA-Z0-9][a-zA-Z0-9-_]{1,61}[a-zA-Z0-9]))\.([a-zA-Z]{2,6}|[a-zA-Z0-9-]{2,30}\.[a-zA-Z]{2,3})$

Après :

^(([a-zA-Z]{1})|([a-zA-Z]{1}[a-zA-Z]{1})|([a-zA-Z]{1}[0-9]{1})|([0-9]{1}[a-zA-Z]{1})|([a-zA-Z0-9][-_\.a-zA-Z0-9]{1,61}[a-zA-Z0-9]))\.([a-zA-Z]{2,13}|[a-zA-Z0-9-]{2,30}\.[a-zA-Z]{2,3})$

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X