Regex Credit Card Number Tests
I'm Testing One Application Where Regex Pattern Match Credit Card Then Such Numbers Should Be Highlighted. I'm Using Site to Create Test Credit Credit Card...
I'm testing one application where Regex pattern match credit card then such numbers should be highlighted. I'm using site to create test credit credit card numbers for my testing. my requirement is to have valid credit card numbers which can have "-" and/or "," between them.I was not successful to build such a number as when i test it using the site
.
I need few credit numbers with scenarios below
- valid credit card number which can have "-" between any digit.
- valid credit card number which can have "," between any digit.
- valid credit card number which can have cobination of "," or "-" between any digit.
13 Answers
Common credit card vendor regular expressions:
- Amex Card:
^3[47][0-9]{13}$ - BCGlobal:
^(6541|6556)[0-9]{12}$ - Carte Blanche Card:
^389[0-9]{11}$ - Diners Club Card:
^3(?:0[0-5]|[68][0-9])[0-9]{11}$ - Discover Card:
^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 Payment Card:
^63[7-9][0-9]{13}$ - JCB Card:
^(?:2131|1800|35\d{3})\d{11}$ - KoreanLocalCard:
^9[0-9]{15}$ - Laser Card:
^(6304|6706|6709|6771)[0-9]{12,15}$ - Maestro Card:
^(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 Card:
^(6334|6767)[0-9]{12}|(6334|6767)[0-9]{14}|(6334|6767)[0-9]{15}$ - Switch Card:
^(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})$ - Visa Card:
^4[0-9]{12}(?:[0-9]{3})?$ - Visa Master Card:
^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14})$
Remove all , and - and other non-digits from the string first.
Then use this regex that matches Visa, MasterCard, American Express, Diners Club, Discover, and JCB cards:
^(?: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})$
2019
DO. NOT. USE. REGEX !!! (with 3 exclamation marks)
From the comments, I must highlight PeteWiFi's comment:
Just a friendly warning, you're in for a world of hurt if you try and match specific schemes and card lengths this way. For example, Switch hasn't existed since 2002, Laser was withdrawn in 2014, Visa are due to issue 19 digit cards and MasterCard are now issuing in the 2xxxxx ranges, just to highlight a couple of issues with this approach. A regex is good for a basic "does it look like a card number" but not much beyond that.
If you want to use regex just to know the card brand for visual use (like displaying Visa logo or label), that is fine. But if your code logic depends on it, then don't use regex, and don't use 3rd party plugin/library!
Regex detecting card numbers is quick & easy. But in the long run, your project will run into many serious & hard-to-solve bugs. Card issuers keep introducing new card number patterns, or withdraw old ones, or may completely close down. Who knows.
Solution
Build your own solution (preferably non-regex) based on some official pages that's frequently updated, like this page on wikipedia.
As for the "-", ".", "space", and all other noise, simply remove all these non-digits, you can use this (Based on this answer):
$number = preg_replace("/[^0-9]/", "", "4111-1111 1111.1111");
// Output: 4111111111111111
Not convinced yet?
This page goes into deep technical details why regex is hell. (Notice the artical used the word "hell" because once you're in you can't go out)