Skip to content

Instantly share code, notes, and snippets.

@claudiosanches
Last active February 22, 2024 19:39
Show Gist options
  • Star 59 You must be signed in to star a gist
  • Fork 14 You must be signed in to fork a gist
  • Save claudiosanches/26d9668f21dbdc787472 to your computer and use it in GitHub Desktop.
Save claudiosanches/26d9668f21dbdc787472 to your computer and use it in GitHub Desktop.
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
Copy link

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

@thiagoleet
Copy link

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
Copy link

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
Copy link

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

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

@valmirphp
Copy link

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
Copy link

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
Copy link

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
Copy link

Muito obrigado!

@herlanijunior
Copy link

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

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

@leandrocrs
Copy link

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
Copy link

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
Copy link

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

@Devmaster1818
Copy link

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]))))$

@terremoth
Copy link

@Devmaster1818 no site dev deles qual? tem o link?

Até hoje é uma desgraça essas coisas de validar números de cartões, sempre tem novas ranges de números surgindo de algumas bandeiras, nunca tem link dos sites oficiais pra dizer como é e como não é pra ser implementado e cada lugar vc vê algumas regex diferentes. É um saco isso

@Bluebom
Copy link

Bluebom commented May 17, 2022

ELO:
(4011|431274|438935|451416|457393|4576|457631|457632|504175|50(4175|6699|67[0-6][0-9]|677[0-8]|9[0-8][0-9]{2}|99[0-8][0-9]|999[0-9])|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])))
Esse aqui funcionou para todos os testes que fiz ^^
https://www.getbincodes.com/company-cc-elo/
https://www.vccgenerator.org
image

@erikbrito
Copy link

erikbrito commented Oct 14, 2022

o regex oficial da ELO você consegue na página de documentação deles, aí pra conseguir pegar tem que logar.
Pra ser mais rápido aqui está o link: https://dev.elo.com.br/apis/tabela-de-bins?lng=pt

@GabrielReguera
Copy link

GabrielReguera commented Jan 26, 2023

Alguem sabe se o Regex da Aura atualizou? no meu não está funcionando... está sempre caindo no Maestro

aura - /^((?!5078))^((?!5067))(^50[0-9])/ ou /^((?!504175))^((?!5067))(^50[0-9])/
maestro - ^(?:5[0678]\\d{0,2}|6304|67\\d{0,2})\\d{0,12}

@PkNeves
Copy link

PkNeves commented May 4, 2023

ELO: (4011|431274|438935|451416|457393|4576|457631|457632|504175|50(4175|6699|67[0-6][0-9]|677[0-8]|9[0-8][0-9]{2}|99[0-8][0-9]|999[0-9])|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]))) Esse aqui funcionou para todos os testes que fiz ^^ https://www.getbincodes.com/company-cc-elo/ https://www.vccgenerator.org image

@Bluebom Muito bom!! Fui usar e percebi que na penúltima expressão faltou fechar uma chave ]. Vou mandar o código com a chave abaixo para quem não queira procurar:

(4011|431274|438935|451416|457393|4576|457631|457632|504175|50(4175|6699|67[0-6][0-9]|677[0-8]|9[0-8][0-9]{2}|99[0-8][0-9]|999[0-9])|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])))

Eu dei uma incrementada usando quantificadores para pegar o tamanho do cartão também. Não consegui comprovar se a ELO trabalha apenas com 16 dígitos, mas estou assumindo que sim:

(4011\d{12}|431274\d{10}|438935\d{10}|451416\d{10}|457393\d{10}|4576\d{12}|457631\d{10}|457632\d{10}|504175\d{10}|50(4175|6699|67[0-6][0-9]|677[0-8]|9[0-8][0-9]{2}|99[0-8][0-9]|999[0-9])\d{10}|627780\d{10}|636297\d{10}|636368\d{10}|636369\d{10}|(6503[1-3])\d{11}|(6500(3[5-9]|4[0-9]|5[0-1]))\d{10}|(6504(0[5-9]|1[0-9]|2[0-9]|3[0-9]))\d{10}|(650(48[5-9]|49[0-9]|50[0-9]|51[1-9]|52[0-9]|53[0-7]))\d{10}|(6505(4[0-9]|5[0-9]|6[0-9]|7[0-9]|8[0-9]|9[0-8]))\d{10}|(6507(0[0-9]|1[0-8]))\d{10}|(6507(2[0-7]))\d{10}|(650(90[1-9]|91[0-9]|920))\d{10}|(6516(5[2-9]|6[0-9]|7[0-9]))\d{10}|(6550(0[0-9]|1[1-9]))\d{10}|(6550(2[1-9]|3[0-9]|4[0-9]|5[0-8]))\d{10}|(506(699|77[0-8]|7[1-6][0-9]))\d{10}|(509([0-9][0-9][0-9]))\d{10})

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