Rexact
Cheatsheet

Regex slug d'URL

Sur la question Stack Overflow dédiée au sujet, les 3 réponses proposées ont chacune un bug signalé en commentaire par un autre utilisateur (ou l'auteur de la question lui-même) : tirets consécutifs acceptés, mots d'un seul caractère imposés, ou majuscules autorisées. Voici le motif de référence d'iHateRegex, comparé aux trois tentatives réelles.

/^[a-z0-9]+(?:-[a-z0-9]+)*$/
passe 22/22 cas

Comparatif des patterns existants

Implémentation

const re = new RegExp("^[a-z0-9]+(?:-[a-z0-9]+)*$", "");
re.test(input);

Limites

  • Impose les lettres minuscules et chiffres ASCII uniquement : un titre accentué (« café ») doit être translittéré (« cafe ») avant de devenir un slug, la regex ne le fait pas elle-même.
  • Ne garantit pas l'unicité du slug dans votre système — deux articles différents peuvent produire le même slug si le titre est identique ou similaire ; il faut une vérification séparée en base.
  • N'impose aucune longueur maximale, ce qui peut poser problème avec des limites d'URL réelles (certains navigateurs et serveurs plafonnent autour de 2000 caractères).
  • N'interdit pas les mots réservés de votre routeur (ex. un slug littéralement nommé « admin » ou « api ») — c'est une règle métier, pas une règle de forme.