Предсказание кредитной карты в Javascript

Я пишу инструмент, который 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;
            }
        }
    }
    });
    });​
    

Вот скрипка

5
задан bob_cobb 11 August 2012 в 21:01
поделиться