Last active
April 8, 2025 20:36
-
-
Save claudiosanches/26d9668f21dbdc787472 to your computer and use it in GitHub Desktop.
Regex for test credit card brand
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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>'; | |
} |
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
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.
Fiz um nova versão que me atendeu para todos os cenários da imagem considerando cartões de 16 dígitos:
^(?: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
@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})