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
| Source | pattern | Score sur le corpus | ReDoS |
|---|---|---|---|
| Stack Overflow — réponse la plus votée, 36 votes (user3427495) — autorise les majuscules | ^[A-Za-z0-9]+(?:-[A-Za-z0-9]+)*$ | 20 / 22 | sûr |
| Stack Overflow — 17 votes (Thibault Lemaire), bug signalé en commentaire par un autre utilisateur | ^[a-z](-?[a-z])*$ | 19 / 22 | sûr |
| Stack Overflow — 4 votes (aelor), bug signalé par l'auteur de la question lui-même | ^[a-z][a-z\-]*[a-z]$ | 16 / 22 | sûr |
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.