Я пишу инструмент, который onkeydown будет запускать текущее значение, введенное в поле ввода, чтобы проверить, соответствует ли оно регулярному выражению для одного из 4 основных типов кредитных карт.
Я чувствую, что это вроде как работает, но это ненадежно, поэтому я хотел выяснить, что заставляет его давать ошибочный ответ (, например.иногда он выводит 2 значения вместо одного ). Это потому, что мне нужно установить переменную флага перед циклом? При совпадении правильной карты я просто возвращаюсь из цикла по объекту, поэтому я подумал, что этого будет достаточно...
Критерии для регулярных выражений взяты с этого сайта:
Виза:^4[0-9]{12}(?:[0-9]{3})?$
Все номера карт Visa начинаются с 4. Новые карты имеют 16 цифр. На старых картах 13.
Мастеркард:^5[1-5][0-9]{14}$
Все номера MasterCard начинаются с цифр от 51 до 55. Все они состоят из 16 цифр.
Американ Экспресс:^3[47][0-9]{13}$
Номера карт American Express начинаются с 34 или 37 и состоят из 15 цифр.
Откройте для себя:^6(?:011|5[0-9]{2})[0-9]{12}$
Номера карт Discover начинаются с 6011 или 65. Все они состоят из 16 цифр.
$(function() {
var $cardNumber = $('#js-cardnumber');
var ccMap = {};
ccMap.cards = {
'amex': '^3[47][0-9]{13}$',
'discover': '^6(?:011|5[0-9]{2})[0-9]{12}$',
'mastercard': '^5[1-5][0-9]{14}$',
'visa': '^4[0-9]{12}(?:[0-9]{3})?$'
};
$cardNumber.keydown(function() {
for (var cardType in ccMap.cards) {
if (ccMap.cards.hasOwnProperty(cardType)) {
var regex = ccMap.cards[cardType];
if (regex.match($(this).val())) {
console.log(cardType);
return;
}
}
}
});
});