Regex numéro de carte UnionPay
Les numéros China UnionPay commencent par 62 et comptent 16 à 19 chiffres (tableau de Wikipedia ; le bulletin Discover de 2017 liste des sous-plages 622126-622925, 624-626 et 6282-6288 de même longueur). Les tentatives relues divergent : validator.js fige 16 chiffres pour « 62 » mais accepte aussi « 67 » (préfixe Maestro) et un préfixe « 81 » de 16 à 19 chiffres, Cleave.js ne teste que le préfixe (62 ou 81), php-credit-card-validator teste « 62 » ou « 88 » sans longueur. Voici un motif sur le préfixe 62 avec 16 à 19 chiffres, comparé à ces tentatives.
/^62[0-9]{14,17}$/passe 23/23 cas
Comparatif des patterns existants
| Source | pattern | Score sur le corpus | ReDoS |
|---|---|---|---|
| validator.js (isCreditCard) — 62 ou 67 sur 16 chiffres (67 est un préfixe Maestro) ; 17 à 19 chiffres refusés pour 62 ; accepte un préfixe 81 | ^(6[27][0-9]{14}|^(81[0-9]{14,17}))$ | 19 / 23 | sûr |
| Cleave.js — motif de saisie progressive sans ancre de fin : « 62 » seul, 20 chiffres et plus passent ; préfixe 81 accepté | ^(62|81)\d{0,14} | 17 / 23 | sûr |
| php-credit-card-validator — « 62 » ou « 88 » sans longueur : toute longueur passe | ^(62|88) | 17 / 23 | sûr |
Implémentation
const re = new RegExp("^62[0-9]{14,17}$", "");
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.
- Sources secondaires pour le préfixe 62 et la longueur 16-19 (voir commentaire). Certaines cartes UnionPay anciennes ne respectent pas la clé de Luhn selon des sources non vérifiées ici : ne rejetez pas sur la seule clé sans consulter votre acquéreur.
- Le préfixe 62 englobe des co-marques (Discover 622126-622925) ; le motif ne les distingue pas.
- Ne stockez ni ne journalisez de vrais numéros de carte (PCI DSS) ; n'utilisez que des numéros de test dans vos tests.