Skip to content

Instantly share code, notes, and snippets.

@claudiosanches
Last active October 22, 2025 18:10
Show Gist options
  • Select an option

  • Save claudiosanches/26d9668f21dbdc787472 to your computer and use it in GitHub Desktop.

Select an option

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

@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
Copy Markdown

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

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

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

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

@valmirphp
Copy link
Copy Markdown

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

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

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

Muito obrigado!

@herlanijunior
Copy link
Copy Markdown

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

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

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

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

@Devmaster1818
Copy link
Copy Markdown

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

@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
Copy Markdown

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

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

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

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})

@mannoeu
Copy link
Copy Markdown

mannoeu commented Aug 8, 2024

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}

Aqui também sempre cai maestro

@terremoth
Copy link
Copy Markdown

Regex hell. É zoado, as próprias companhias poderiam fornecer regex ou algoritmos/sdks pros serviços deles porque é foda. Volte meia essas sequencias mudam, e dar manutenção em regex é um inferno.

@thadeucity
Copy link
Copy Markdown

Fiz um nova versão que me atendeu para todos os cenários da imagem considerando cartões de 16 dígitos:

image

^(?:40117[8-9]|431274|438935|451416|457393|45763[1-2]|504175|506699|5067(?:[0-6][0-9]|7[0-8])|509[0-9][0-9][0-9]|627780|636297|636368|6500(?:3[1-3]|3[5-9]|4[0-9]|5[0-1])|650(?:4(?:0[5-9]|[1-9][0-9])|5(?:[0-2][0-9]|3[0-8]|4[1-9]|[5-8][0-9]|9[0-8]))|6507(?:0[0-9]|1[0-8]|2[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])|65165[2-4]|65048[5-8]|650489|65049[0-4])\d{10}$

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