Expression régulière pour les données de suivi de carte de crédit
Sont-ils connus des expressions régulières pour valider la carte de crédit de la voie 1 et la voie 2 données?
EDIT:
De Wikipedia:
Les informations sur la piste 1 sur les cartes financières contenues dans plusieurs formats: A, qui est réservé pour une utilisation exclusive de l'émetteur de la carte, B, qui est décrit ci-dessous, C-M, qui sont réservés pour une utilisation par l'ANSI sous-comité X3B10 et N-Z, qui sont disponibles pour l'utilisation par les émetteurs de cartes:
Piste 1Format B:
- Commencer sentinel — un personnage (en général,'%')
- Format code="B" — un personnage (alpha uniquement)
- Numéro de compte primaire (PAN) — jusqu'à 19 caractères. Habituellement, mais pas toujours, correspond à la carte de crédit numéro imprimé sur la face avant de la carte.
- Séparateur de champ — un personnage (généralement '^')
- Nom — de deux à 26 caractères
- Séparateur de champ — un personnage (généralement '^')
- Date d'Expiration — quatre caractères dans le formulaire YYMM.
- Code de Service — trois personnages
- Discrétionnaire de données peut inclure la Vérification du code Pin de la Clé Indicateur (PVKI, 1 caractère), la Vérification du code PIN de la Valeur (PVV, 4 caractères), la Valeur de Vérification de Carte ou un Code de Vérification de Carte (CVV ou CVK, 3 caractères)
- Fin sentinel — un personnage (en général,'?')
- Contrôle de redondance longitudinale (LRC) — il est d'un caractère et d'une validité de caractère calculée à partir d'autres données sur la piste. Il convient de noter que la plupart des appareils de lecture ne pas retourner cette valeur lorsque la carte est glissée à la couche de présentation, et de l'utiliser uniquement pour vérifier l'entrée en interne pour le lecteur.
Piste 2: Ce format a été développé par le secteur bancaire (ABA). Cette piste est écrit avec 5 bits système (4 bits de données + 1 parité), qui permet de seize caractères possibles, qui sont les nombres de 0 à 9, ainsi que le six personnages : ; < = > ? . La sélection de six symboles de ponctuation peut sembler bizarre, mais en fait, le seize codes tout simplement la carte à la plage ASCII 0x30 à travers 0x3f, qui définit les dix chiffres de caractères en plus de ces six symboles. Le format des données est comme suit:
- Commencer sentinel — un personnage (en général,';')
- Numéro de compte primaire (PAN) — jusqu'à 19 caractères. Habituellement, mais pas toujours, correspond à la carte de crédit numéro imprimé sur la face avant de la carte.
- Séparateur — un char (généralement '=')
- Date d'Expiration — quatre caractères dans le formulaire YYMM.
- Code de Service — trois personnages
- Discrétionnaire de données dans une piste
- Fin sentinel — un personnage (en général,'?')
- Contrôle de redondance longitudinale (LRC) — il est d'un caractère et d'une validité de caractère calculée à partir d'autres données sur la piste. Il convient de noter que la plupart des appareils de lecture ne pas retourner cette valeur lorsque la carte est glissée à la couche de présentation, et de l'utiliser uniquement pour vérifier l'entrée en interne pour le lecteur.
source d'informationauteur NYSystemsAnalyst
Vous devez vous connecter pour publier un commentaire.
J'allais poster le même lien sur regular-expressions.info pour vérifier le numéro de cc partie de la piste.
Maintenant vient la partie difficile. Suivre l'évolution des données varie en format entre les émetteurs de cartes et même des lecteurs de cartes. Par exemple, le "séparateur" les personnages ne sont pas toujours les mêmes. Même chose s'applique à la fin 'sentinelles'.
De Wikipedia donne une bonne vue d'ensemble: http://en.wikipedia.org/wiki/Magnetic_stripe_card
Avec la piste 2, le numéro de la carte est suivi par un '=' (ou parfois un "D"). Ensuite, vous avez la date d'expiration comme MMJJ. Après cela, la piste 2 a 'discrétionnaire des données, qui pourrait être n'importe quoi.
Je ne m'inquiéterais pas trop après ce point. Si c'est de suivre les données, vous serez assez sûr que maintenant. Je suppose que cela dépend de ce que vous cherchez à faire avec les données.
De toute façon, pour la piste 2, vous pourriez faire bien pire que l'ajout de [=D][0-9]{4} au lieu de $ à la fin de la cc de la regex:
Pour track1, vous pourriez faire quelque chose de similaire ... Track1 contient plus de données variables, donc peut être un peu plus compliqué.
Bonne chance!
Voici une REGEX qui fonctionne pour moi de prendre à la fois la Piste 1 et la Piste 2. Utilisez cette fonction avec la regex option "Point ne correspond PAS de saut de ligne".
J'ai testé avec ces données (mon lecteur est à la lecture de la Piste 1 et la Piste 2, dans cet ordre, pour la même carte que j'ai testé avec des numéros et le nom a été changé en dessous.)
Ci-dessus REGEX utilise les noms de GROUPES de CAPTURE (le "?" qui commence chaque (groupe de)) et je vois le résultat (avec RegexBuddy):
Remarque le deuxième match ne permet PAS d'identifier FC (format de code) et NM (nom) dans la Piste 2 (match 2) car elles ne sont pas utilisées sur la piste 2.
Si votre moteur d'expressions régulières ne prend pas en charge les GROUPES NOMMÉS, il suffit de tuer le "?" de la partie de chacun des groupes capturés. Ensuite, utiliser la position de déterminer à chaque groupe.
Aussi, mon seul passage contient à la FOIS la piste 1 et la piste 2 (dans cet ordre, la piste 1, un crlf puis la piste 2). D'après Wikipedia, le lien dans la question d'origine, les cartes peuvent avoir jusqu'à 3 pistes et les lecteurs peuvent lire les pistes 1 et 2 (ou l'un ou l'autre) et, rarement, la piste 3.
Pour cette raison, je pense que c'est un pari sûr à utiliser une REGEX qui regarde à la fois la piste 1 et la piste 2 et si vous obtenez à la fois, vous pouvez ignorer la piste 2 (depuis la piste 1 a plus de données) ou ce que vous voulez.
Parce que les deux pistes sont présents dans mon frottis, le moteur d'expressions régulières sera de retour le 2 correspond à mon expression régulière ci-dessus (en supposant qu'aucune erreur de lecture du lecteur et un lecteur qui prend en charge les deux pistes). Dans mon cas, cela ne me dérange pas et je vais simplement plan pour utiliser le "premier match" et ignorer le second.
Si vous n'êtes intéressés que dans la piste 1, utilisez cette regex:
Si vous n'êtes intéressés que dans la piste 2, utiliser la regex:
Mais je ne vois pas de mal à vérifier pour les deux, et ensuite à l'aide de la première que vous obtenez, ou peut-être la comparaison de la piste 1 à la piste 2, comme une erreur supplémentaire de vérification de l'étape peut-être.
Désolé de répondre à ce qui semble être une réponse!
Les deux expressions régulières suivantes semblent valider la piste 1 et la piste 2 de données. Notez que ces expressions régulières émettre des hypothèses que les caractères utilisés sont ceux qui sont "généralement" utilisé dans le Wikipedia de l'information ci-dessus.
Suppose que % et ? sont les sentinelles de caractères et que ^ est utilisé comme caractère séparateur de champ. Suppose également que le numéro de compte, la date et le code de service sont des chiffres.
Suppose que ;? sont les sentinelles de caractères et que = est le caractère séparateur de champ. Suppose également que le numéro de compte, la date et le code de service sont des chiffres.
J'ai testé ces expressions à l'aide de la piste de lecture de données à partir d'un MagTek lecteur de carte. Les deux ensembles suivants de suivre les données correspondent à ce qui a été lu à partir du lecteur et de valider contre les deux expressions ci-dessus (les chiffres ont de toute évidence été changé):
La piste 1, le Format B se traduit par
avec certaines hypothèses quant à ce qui constitue un caractère valide.
Bien sûr, il n'y a pas vérifie si les données sont réellement significatif, et le LRC (si présent) a également ne peut pas être validée.
Pouvez-vous vérifier par rapport à certaines données réelles et voir si cela fonctionne?
Piste 2 se traduit par
Remarque: le numéro de Compte dans track1 peut contenir des espaces pour les cartes American Express.
Donc :