Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Regex for test credit card brand
<?php
// Test cards
$cards = array(
'378282246310005', // American Express
'371449635398431', // American Express
'5078601870000127985', // Aura
'5078601800003247449', // Aura
'30569309025904', // Diners Club
'38520000023237', // Diners Club
'6011111111111117', // Discover
'6362970000457013', // Elo
'6062825624254001', // Hipercard
'5555555555554444', // MasterCard
'5105105105105100', // MasterCard
'6759649826438453', // Maestro
'6799990100000000019', // Maestro
'4111111111111111', // Visa
'4012888888881881', // Visa
);
// Brands regex
$brands = array(
'visa' => '/^4\d{12}(\d{3})?$/',
'mastercard' => '/^(5[1-5]\d{4}|677189)\d{10}$/',
'diners' => '/^3(0[0-5]|[68]\d)\d{11}$/',
'discover' => '/^6(?:011|5[0-9]{2})[0-9]{12}$/',
'elo' => '/^((((636368)|(438935)|(504175)|(451416)|(636297))\d{0,10})|((5067)|(4576)|(4011))\d{0,12})$/',
'amex' => '/^3[47]\d{13}$/',
'jcb' => '/^(?:2131|1800|35\d{3})\d{11}$/',
'aura' => '/^(5078\d{2})(\d{2})(\d{11})$/',
'hipercard' => '/^(606282\d{10}(\d{3})?)|(3841\d{15})$/',
'maestro' => '/^(?:5[0678]\d\d|6304|6390|67\d\d)\d{8,15}$/',
);
// Run test
foreach ( $cards as $number ) {
$brand = 'undefined';
foreach ( $brands as $_brand => $regex ) {
if ( preg_match( $regex, $number ) ) {
$brand = $_brand;
break;
}
}
echo '<pre>' . print_r( array( $number, $brand ), true ) . '</pre>';
}
@edvaldoszy

This comment has been minimized.

Copy link

@edvaldoszy edvaldoszy commented Jul 13, 2017

@claudiosanches gostaria de saber onde você obteve essas regras e caso surja algum regra nova, como poderia obter essa atualização? Obrigado.

@thiagoleet

This comment has been minimized.

Copy link

@thiagoleet thiagoleet commented Sep 14, 2017

Essa validação pra Mastercard já não é tão precisa. /^(5[1-5] detecta somente cartões que começam de 51 até 55, mas já vi casos de cartões Mastercard que comecem com 58 e 59

@MauroMaciel

This comment has been minimized.

Copy link

@MauroMaciel MauroMaciel commented Feb 16, 2018

Você deveria colocar a regra do Elo antes da do Visa, várias vezes essa validação considera um cartão da Elo como Visa.

@valmirphp

This comment has been minimized.

Copy link

@valmirphp valmirphp commented Jul 26, 2018

Neste link, tem umas info sobre a BIN e validação bem legal.

https://github.com/erikhenrique/bin-cc

@valmirphp

This comment has been minimized.

Copy link

@valmirphp valmirphp commented Jul 26, 2018

Regex atualizado para EO =>

'elo'  =>  '/^((((636368)|(438935)|(636369)|(504175)|(451416)|(636297)|(506699))\d{0,10})|((5067)|(4576)|(4011))\d{0,12})/',
@marquinhosoliveira

This comment has been minimized.

Copy link

@marquinhosoliveira marquinhosoliveira commented Sep 24, 2018

Regra para Elo ainda não bate com todos os cartões.
Fiz uma Hiper expressão que merece ser refatorada mas ja resolveu meu lado

Expressão para Elo
(4011|431274|438935|451416|457393|4576|457631|457632|504175|627780|636297|636368|636369|(6503[1-3])|(6500(3[5-9]|4[0-9]|5[0-1]))|(6504(0[5-9]|1[0-9]|2[0-9]|3[0-9]))|(650(48[5-9]|49[0-9]|50[0-9]|51[1-9]|52[0-9]|53[0-7]))|(6505(4[0-9]|5[0-9]|6[0-9]|7[0-9]|8[0-9]|9[0-8]))|(6507(0[0-9]|1[0-8]))|(6507(2[0-7]))|(650(90[1-9]|91[0-9]|920))|(6516(5[2-9]|6[0-9]|7[0-9]))|(6550(0[0-9]|1[1-9]))|(6550(2[1-9]|3[0-9]|4[0-9]|5[0-8]))|(506(699|77[0-8]|7[1-6][0-9))|(509([0-9][0-9][0-9])))

Detalhamento das faixas:
650031 à 650033, ==> Exp (6503[1-3])
650035 à 650051, ==> Exp, (6500(3[5-9]|4[0-9]|5[0-1]))
650405 à 650439, ==> Exp(6504(0[5-9]|1[0-9]|2[0-9]|3[0-9]))
650485 à 650538, ==> Exp(650(48[5-9]|49[0-9]|50[0-9]|51[1-9]|52[0-9]|53[0-7]))
650541 à 650598, ==> Exp(6505(4[0-9]|5[0-9]|6[0-9]|7[0-9]|8[0-9]|9[0-8]))
650700 à 650718, ==> Exp(6507(0[0-9]|1[0-8]))
650720 à 650727, ==> Exp(6507(2[0-7]))
650901 à 650920, ==> Exp(650(90[0-9]|91[0-9]|920))
651652 à 651679, ==> Exp(6516(5[2-9]|6[0-9]|7[0-9]))
655000 à 655019, ==> Exp(6550(0[0-9]|1[1-9]))
655021 à 655058, ==> Exp(6550(2[1-9]|3[0-9]|4[0-9]|5[0-8]))
506699 à 506778 , ==> Exp(506(699|77[0-8]|7[0-6][0-9]))
509000 à 509999, ==> Exp, (509([0-9][0-9][0-9]))
Iniciais sem faixas
627780,636297,636368,636369, 4011, 431274, 438935, 451416, 457393, 4576, 457631, 457632, 504175,

@gmmaraccini

This comment has been minimized.

Copy link

@gmmaraccini gmmaraccini commented Jan 23, 2019

Elo atualizado 2019
^(40117[8-9]|431274|438935|451416|457393|45763[1-2]|506(699|7[0-6][0-9]|77[0-8])|509\d{3}|504175|627780|636297|636368|65003[1-3]|6500(3[5-9]|4[0-9]|5[0-1])|6504(0[5-9]|[1-3][0-9])|650(4[8-9][0-9]|5[0-2][0-9]|53[0-8])|6505(4[1-9]|[5-8][0-9]|9[0-8])|6507(0[0-9]|1[0-8])|65072[0-7]|6509(0[1-9]|1[0-9]|20)|6516(5[2-9]|[6-7][0-9])|6550([0-1][0-9]|2[1-9]|[3-4][0-9]|5[0-8]))

@gustavo-fernandes

This comment has been minimized.

Copy link

@gustavo-fernandes gustavo-fernandes commented May 20, 2019

Muito obrigado!

@herlanijunior

This comment has been minimized.

Copy link

@herlanijunior herlanijunior commented May 1, 2020

Minha sugestão de validação é a seguinte:

Ordem Bandeira
1 ELO
2 HIPERCARD
3 DINERS
4 AMEX
5 MASTERCARD
6 VISA
@leandrocrs

This comment has been minimized.

Copy link

@leandrocrs leandrocrs commented Aug 28, 2020

Aura também não está batendo. Algumas estão sendo detectadas como mastercard.

Gerei pelo https://www.4devs.com.br/gerador_de_numero_cartao_credito.

6062820446079595
5085705358351113
5090752762253595
5088787736515335
5064539927513258
@JeffersonTeixeira

This comment has been minimized.

Copy link

@JeffersonTeixeira JeffersonTeixeira commented Sep 20, 2020

6062820446079595

Esse é Hipercard.
O pattern que tenho usado para detectar cartões aura é:
/^((?!504175))^((?!5067))(^50[0-9])/ (syntax Javascript)
Utilizo a ordem sugerida pelo @herlanijunior. Testo Aura após MasterCard

@acarolsf

This comment has been minimized.

Copy link

@acarolsf acarolsf commented Nov 20, 2020

6516 5200 0000 0000 é um elo card, mas está sendo detectado como um discover card

@Devmaster1818

This comment has been minimized.

Copy link

@Devmaster1818 Devmaster1818 commented May 21, 2021

Pessoal o Regex Oficial da Elo que está no site dev deles é este;

^(50(67(0[78]|1[5789]|2[012456789]|3[0123459]|4[0-7]|53|7[4-8])|9(0(0[0-9]|1[34]|2[0134567]|3[0359]|4[01235678]|5[015789]|6[012356789]|7[013]|8[1234789]|9[1379])|1(0[34568]|4[6-9]|5[1-8]|8[36789])|2(2[02]|5[7-9]|6[012356789]|7[012345689]|8[012356789]|90)|357|4(0[7-9]|1[0-9]|2[0-2]|5[7-9]|6[0-7]|8[45])|55[01]|636|7(2[3-8]|31|6[5-9])))|4(0117[89]|3(1274|8935)|5(1416|7(393|63[12])))|6(27780|36368|5(0(0(3[1258]|4[026]|7[78])|4(06|1[0234]|2[2-9]|3[04589]|8[5-9]|9[0-9])|5(0[01346789]|1[012456789]|2[0-9]|3[0178]|5[2-9]|6[0-6]|7[7-9]|8[0134678]|9[1-8])|72[0-7]|9(0[1-9]|1[0-8]|2[0128]|3[89]|4[6-9]|5[0158]|6[2-9]|7[01]))|16(5[236789]|6[025678]|7[01456789]|88)|50(0[01356789]|1[2568]|36|5[1267]))))$

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment