Rexact
Cheatsheet

Regex nom de domaine (hostname)

La réponse la plus votée (34 votes) sur la question de référence de Stack Overflow a un vrai défaut signalé en commentaire : elle valide un nom de domaine dont le dernier segment est entièrement numérique (comme « domaine.123 »), ce que la RFC 1912 interdit précisément pour éviter la confusion avec une adresse IP. Une réponse citant le HTML Living Standard ne vérifie ni la longueur totale (255 caractères max) ni ce même point. Voici un motif qui corrige ce défaut précis, comparé à ces deux tentatives et à une troisième, trop permissive, testée sur une longue liste de cas réels par son auteur mais qui accepte pourtant des points consécutifs.

/^(?!(?:.*\.)?[0-9]+\.?$)(?=.{1,255}$)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*\.?$/
passe 23/23 cas

Comparatif des patterns existants

SourcepatternScore sur le corpusReDoS
Stack Overflow — réponse la plus votée (34 votes), valide un dernier segment entièrement numérique (bug signalé en commentaire, contraire à la RFC 1912)^(?=.{1,255}$)[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?(?:\.[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?)*\.?$20 / 23sûr
Stack Overflow — réponse testée sur une longue liste de cas réels par son auteur, accepte pourtant des points consécutifs et une longueur illimitée^[A-Za-z0-9][A-Za-z0-9-.]*\.\D{2,4}$19 / 23sûr
Stack Overflow — variante citant le HTML Living Standard, sans contrôle de longueur ni de point final ni de la règle RFC 1912^[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$19 / 23indéterminé

Implémentation

const re = new RegExp("^(?!(?:.*\\.)?[0-9]+\\.?$)(?=.{1,255}$)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*\\.?$", "");
re.test(input);

Limites

  • L'exclusion des noms se terminant par un segment entièrement numérique suit la RFC 1912, mais cette règle n'est pas toujours appliquée en pratique par les registres ou les résolveurs DNS : certains sous-domaines réellement utilisés (pas le domaine racine) sont entièrement numériques malgré la RFC.
  • Ne vérifie que la forme du nom : ne consulte aucun DNS, ne garantit ni qu'un enregistrement existe pour ce nom, ni qu'un TLD donné (« .com », « .zzz »...) est réellement délégué par l'IANA.
  • Ne traduit pas les noms de domaine internationalisés (IDN) écrits directement en caractères Unicode (« café.fr ») : seule leur forme Punycode déjà encodée (« xn--caf-dma.fr ») est reconnue, conformément à la limitation des classes [a-zA-Z0-9] à l'ASCII.
  • Le contrôle de longueur globale (255 caractères) ne distingue pas la longueur de chaque étiquette individuelle (limitée à 63) de celle du nom complet : une étiquette de 64 caractères ou plus est déjà rejetée par ailleurs, mais un futur ajustement du motif devra conserver cette double contrainte séparément.