Rexact
Cheatsheet

Regex URL slug

On the Stack Overflow question dedicated to this exact topic, all 3 proposed answers have a bug flagged in the comments (by another user, or by the question's own author): consecutive dashes accepted, single-character words enforced, or uppercase allowed. Here's the reference pattern from iHateRegex, compared against the three real attempts.

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

Comparison of existing patterns

Implementation

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

Limits

  • 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.