Regex numéro de carte Visa
Un numéro Visa commence par 4. La FAQ « numerics » de Visa parle de PAN de 16 ou 19 chiffres ; le tableau de Wikipedia ajoute 13 chiffres (anciennes plages), ce que Visa ne confirme pas. Les tentatives relues divergent sur la longueur : regular-expressions.info n'accepte que 13 ou 16 chiffres (un PAN de 19 chiffres est refusé), validator.js accepte 13 et 16 à 19 chiffres, donc aussi 17 et 18, que personne n'émet, Cleave.js et php-credit-card-validator ne testent que le préfixe, et le motif de l'OWASP ne borne pas la fin de sa première branche. Voici un motif qui accepte exactement 13, 16 et 19 chiffres, comparé à ces tentatives.
/^4(?:[0-9]{12}|[0-9]{15}|[0-9]{18})$/passe 25/25 cas
Comparatif des patterns existants
| Source | pattern | Score sur le corpus | ReDoS |
|---|---|---|---|
| regular-expressions.info — correcte pour 13 et 16 chiffres mais refuse les PAN Visa de 19 chiffres | ^4[0-9]{12}(?:[0-9]{3})?$ | 24 / 25 | sûr |
| validator.js (isCreditCard) — accepte 13 et 16 à 19 chiffres : les longueurs 17 et 18 passent | ^(?:4[0-9]{12})(?:[0-9]{3,6})?$ | 23 / 25 | sûr |
| Cleave.js — motif de saisie progressive sans ancre de fin : « 4 » seul et 17 chiffres et plus passent | ^4\d{0,15} | 15 / 25 | sûr |
| OWASP Validation Regex Repository — motif multi-marques : 13 chiffres refusés, première branche sans « $ » (17 à 20 chiffres et « 4242424242424242x » passent) | ^((4\d{3})|(5[1-5]\d{2})|(6011)|(7\d{3}))-?\d{4}-?\d{4}-?\d{4}|3[4,7]\d{13}$ | 16 / 25 | indéterminé |
| php-credit-card-validator — seulement « commence par 4 » : toute longueur passe | ^4 | 15 / 25 | sûr |
Implémentation
const re = new RegExp("^4(?:[0-9]{12}|[0-9]{15}|[0-9]{18})$", "");
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.
- Les PAN de 13 chiffres sont acceptés d'après Wikipedia ; la FAQ de Visa ne cite que 16 et 19 chiffres. Si vous n'acceptez que les cartes actuelles, retirez la branche de 13 chiffres.
- Le motif n'identifie pas les sous-marques (Electron, débit) ni les plages 8 chiffres qui se chevauchent avec d'autres réseaux.
- Ne stockez ni ne journalisez de vrais numéros de carte (PCI DSS) ; n'utilisez que des numéros de test dans vos tests.