wake-up-neo.com

Regex Kreditkartennummer Tests

Ich teste eine Anwendung, bei der die Regex-Muster-Kreditkarte übereinstimmt. Dann sollten diese Nummern hervorgehoben werden. Ich benutze site http://regexpal.com/ , um Testkreditkartennummern für meine Tests zu erstellen. Meine Forderung ist, gültige Kreditkartennummern zu haben, die "-" und/oder "," zwischen sich haben können. Es war nicht erfolgreich, eine solche Nummer zu erstellen, als wenn ich sie mit der Site teste

http://regexpal.com .

Ich brauche ein paar Kreditnummern mit Szenarien unten

  1. gültige Kreditkartennummer, die zwischen jeder Ziffer ein "-" haben kann.
  2. gültige Kreditkartennummer, die zwischen jeder Ziffer ein "," haben kann.
  3. gültige Kreditkartennummer, die zwischen jeder Ziffer eine Kombination aus "," oder "-" haben kann.
36
user1209784

Entfernen Sie zuerst alle , und - und andere Nicht-Ziffern aus der Zeichenfolge.

Verwenden Sie dann diesen regulären Ausdruck, der zu Visa, MasterCard, American Express, Diners Club, Discover und JCB-Karten passt:

^(?:4[0-9]{12}(?:[0-9]{3})?|[25][1-7][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$

51

Häufige reguläre Ausdrücke für Kreditkartenanbieter:

  • Amex-Karte: ^3[47][0-9]{13}$
  • BCGlobal: ^(6541|6556)[0-9]{12}$
  • Carte Blanche-Karte: ^389[0-9]{11}$
  • Diners Club-Karte: ^3(?:0[0-5]|[68][0-9])[0-9]{11}$
  • Karte entdecken: ^65[4-9][0-9]{13}|64[4-9][0-9]{13}|6011[0-9]{12}|(622(?:12[6-9]|1[3-9][0-9]|[2-8][0-9][0-9]|9[01][0-9]|92[0-5])[0-9]{10})$
  • Insta-Zahlungskarte: ^63[7-9][0-9]{13}$
  • JCB-Karte: ^(?:2131|1800|35\d{3})\d{11}$
  • KoreanLocalCard: ^9[0-9]{15}$
  • Laserkarte: ^(6304|6706|6709|6771)[0-9]{12,15}$
  • Maestro-Karte: ^(5018|5020|5038|6304|6759|6761|6763)[0-9]{8,15}$
  • Mastercard: ^(5[1-5][0-9]{14}|2(22[1-9][0-9]{12}|2[3-9][0-9]{13}|[3-6][0-9]{14}|7[0-1][0-9]{13}|720[0-9]{12}))$
  • Solo-Karte: ^(6334|6767)[0-9]{12}|(6334|6767)[0-9]{14}|(6334|6767)[0-9]{15}$
  • Karte wechseln: ^(4903|4905|4911|4936|6333|6759)[0-9]{12}|(4903|4905|4911|4936|6333|6759)[0-9]{14}|(4903|4905|4911|4936|6333|6759)[0-9]{15}|564182[0-9]{10}|564182[0-9]{12}|564182[0-9]{13}|633110[0-9]{10}|633110[0-9]{12}|633110[0-9]{13}$
  • Union Pay Card: ^(62[0-9]{14,17})$
  • Visakarte: ^4[0-9]{12}(?:[0-9]{3})?$
  • Visa Master Card: ^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14})$
143
ajithparamban

Die akzeptierte Antwort ist großartig, aber um der neuen MasterCard BIN gerecht zu werden, müsste sie meines Erachtens aktualisiert werden auf:

^(?:4[0-9]{12}(?:[0-9]{3})?|[25][1-7][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$

(das kritische Stück ist [25][1-7][0-9]{14}, da die erste Ziffer nun entweder eine 2 oder eine 5 sein kann und die zweite Ziffer bis zu 7 sein kann)

Bitte korrigiere mich wenn ich falsch liege!

7
skwidbreth

Für Rupay-Debitkarte: ^6[0-9]{15}$

6
Aditya Rao

2019

DO. NICHT. VERWENDEN. REGEX !!! (mit 3 Ausrufezeichen)


Aus den Kommentaren muss ich den Kommentar von PeteWiFi hervorheben:

Nur eine freundliche Warnung, wenn Sie versuchen, bestimmte Schemata und Kartenlängen auf diese Weise abzugleichen, werden Sie schwer verletzt. Zum Beispiel gab es Switch seit 2002 nicht mehr, Laser wurde 2014 zurückgezogen, Visa soll 19-stellige Karten ausstellen und MasterCard wird jetzt in den 2xxxxx-Bereichen ausgestellt, um nur einige Probleme mit diesem Ansatz hervorzuheben. Ein regulärer Ausdruck ist gut für ein einfaches "sieht es aus wie eine Kartennummer", aber nicht viel darüber hinaus.

Wenn Sie regex verwenden möchten, um nur die Kartenmarke für den visuellen Gebrauch (Anzeige des Visa-Logos oder -Labels) zu kennen, ist dies in Ordnung. Aber wenn Ihre Codelogik davon abhängt, verwenden Sie kein Regex und keine Plugins/Bibliotheken von Drittanbietern!

Das Regex-Erkennen von Kartennummern ist schnell und einfach (so ansprechend, ich weiß!). Aber auf lange Sicht wird Ihr Projekt auf viele schwerwiegende und schwer zu lösende Fehler stoßen. Kartenherausgeber führen weiterhin neue Kartennummernmuster ein oder ziehen alte zurück oder schließen möglicherweise vollständig. Wer weiß.


Lösung

Erstellen Sie Ihre eigene Lösung (vorzugsweise ohne regulären Ausdruck) auf der Grundlage einiger offizieller Seiten, die häufig aktualisiert werden, z. B. diese Seite auf Wikipedia .

Entfernen Sie für das "-", ".", "Leerzeichen" und alle anderen Rauschen einfach alle diese Nicht-Ziffern. Sie können dies verwenden (Basierend auf diesem Antwort ):

$number = preg_replace("/[^0-9]/", "", "4111-1111 1111.1111");
// Output: 4111111111111111

Noch nicht überzeugt?

Auf dieser Seite erfahren Sie, warum Regex die Hölle ist. . (Beachten Sie, dass der Künstler das Wort "Hölle" verwendet hat, denn wenn Sie erst einmal drin sind, können Sie nicht mehr raus.)

2
evilReiko

Regx für Rupay-Karte:

(508 [5-9] [0-9] {12}) | (6069 [8-9] [0-9] {11}) | (607 [0-8] [0-9] {12}) (6079 [0-8] [0-9] {11}) | (608 [0-5] [0-9] {12}) | (6521 [5-9] [0-9] {11} (652 [2-9] [0-9] {12}) | (6530 [0-9] {12}) | (6531 [0-4] [0-9] {11})

unter Verwendung der Abfallserie: 508500 - 508999, 606985 - 606999, 607000 - 607899, 607900 - 607984, 608001 - 608500, 652150 - 652199,. 652200 652999 653000 653099 653100 653149

1
Padam Singh

Zusätzlich zu allen oben genannten, gibt es eine Regex für neue MasterCards, die 2221-2720 BINs enthält:

^5[1-5][0-9]{0,14}|^(222[1-9]|2[3-6]\\d{2}|27[0-1]\\d|2720)[0-9]{0,12}

Beachten Sie, dass dieser reguläre Ausdruck übereinstimmt, wenn der Benutzer mit der Eingabe von Kartennummern beginnt, die MasterCard entsprechen. Wenn der Benutzer beispielsweise "222185" eingibt, stimmt der Regex überein, da es keinen anderen Kartentyp gibt, der mit "2221" beginnt. Diese Regex kann sich als nützlich erweisen, wenn Sie den Kartentyp während der Eingabe der ersten Ziffern der Karte anzeigen möchten.

Wenn Sie "post factum" passen möchten, können Sie alternativ den letzten Teil von {0,14} und {0,12} in {14} und {12} ändern:

^5[1-5][0-9]{14}|^(222[1-9]|2[3-6]\\d{2}|27[0-1]\\d|2720)[0-9]{12}
1
azizbekian

Regex für führende Kartennetzwerke

Master Card (2-Bin, 5-Bin beide): "(?: 5 [1-5] [0-9] {2} | 222 [1-9] | 22 [3-9] [ 0-9] | 2 [3-6] [0-9] {2} | 27 [01] [0-9] | 2720) [0-9] {12} "

Visa : "^ 4 [0-9] {6,} $"

Diner's Club : "(^ 30 [0-5] [0-9] {11} $) | (^ (36 | 38) [0-9] {12} $)"

American Express : "^ [34 | 37] [0-9] {14} $"

JCB: "(^ 3 [0-9] {15} $) | (^ (2131 | 1800) [0-9] {11} $)"

Entdecken Sie : "^ 6011 -?\D {4} -?\D {4} -?\D {4} $"

0
Ripudaman Singh

Ich habe mir einen Regex ausgedacht, der Striche und Leerzeichen erlaubt. Testen Sie es hier: https://regex101.com/r/Rx2iWD/1

Um Kommas zuzulassen (was ich für ungewöhnlich halte), fügen Sie es einfach zur sep-Definition hinzu.

In PHP:

$ccPatt = '/
    (?(DEFINE)
        (?<sep> [ -]?)
    )
    (?<!\d)(?:
      \d{4} (?&sep) \d{4} (?&sep) \d{4} (?&sep) \d{4}               # 16 digits
    | \d{3} (?&sep) \d{3} (?&sep) \d{3} (?&sep) \d (?&sep) \d{3}    # 13 digits
    | \d{4} (?&sep) \d{6} (?&sep) \d{4}                             # 14 digits
    | \d{4} (?&sep) \d{6} (?&sep) \d{5}                             # 15 digit card
    )(?!\d)
/xu';
0
mpen

First Data validiert 15 Stellen für Amex und 16 für Visum, Mc, Discover, Diners und JCB. Daher sende ich nur die Kartennummer an sie, wenn die Nummer 15 oder 16 Ziffern lang ist.

^[0-9]{15}(?:[0-9]{1})?$
0
Bolo