Regex numéro de carte Diners Club
Diners Club International occupe les plages 300-305, 3095, 36, 38 et 39 d'après le bulletin Discover Global Network (février 2017), avec 14 à 19 chiffres (minimum 14 seulement pour 36 dans ce bulletin ; les autres plages y démarrent à 16). Les tentatives relues ne suivent pas cela : regular-expressions.info fige 14 chiffres et omet 39 et 3095, Cleave.js ne teste que le préfixe, et php-credit-card-validator accepte tout « 30 », par exemple 3060 ou 3099. Voici un motif sur ces plages avec 14 à 19 chiffres, comparé à ces tentatives.
/^(?:30[0-5][0-9]|3095|36[0-9]{2}|3[89][0-9]{2})[0-9]{10,15}$/passe 22/22 cas
Comparatif des patterns existants
| Source | pattern | Score sur le corpus | ReDoS |
|---|---|---|---|
| regular-expressions.info (idem validator.js) — 14 chiffres seulement ; préfixes 39 et 3095 absents, 16 à 19 chiffres refusés | ^3(?:0[0-5]|[68][0-9])[0-9]{11}$ | 18 / 22 | sûr |
| Cleave.js — motif de saisie progressive : « 36 » seul, 309x quelconque et 20 chiffres et plus passent | ^3(?:0([0-5]|9)|[689]\d?)\d{0,11} | 16 / 22 | sûr |
| php-credit-card-validator — « 30 », « 36 », « 38 » et « 39 » en entier : 3060 ou 3099 passent, longueur libre | ^3[0689] | 15 / 22 | sûr |
Implémentation
const re = new RegExp("^(?:30[0-5][0-9]|3095|36[0-9]{2}|3[89][0-9]{2})[0-9]{10,15}$", "");
re.test(input);Limites
- Valide seulement la FORME (préfixe et longueur) : ni la clé de Luhn (le corpus contient un numéro de forme correcte et de clé fausse qui passe), ni l'existence du compte, ni la date d'expiration ou le CVV. Les espaces et tirets sont refusés : normalisez avant validation.
- Le bulletin de Discover donne 16 à 19 chiffres (et non 14) pour 300-305, 3095, 38 et 39 : les numéros de test à 14 chiffres de Stripe/PayPal en 300-305 et 36 sont acceptés ici. Les cartes Diners Club d'Amérique du Nord (préfixe 55, 16 chiffres) sont traitées comme Mastercard.
- Ne stockez ni ne journalisez de vrais numéros de carte (PCI DSS) ; n'utilisez que des numéros de test dans vos tests.