2016-09-03 10 views
0

Я следующее регулярное выражение, используемое для проверки кредитной карты типа номера с помощью JavaScriptНедопустимого регулярного выражение ничего не повторить для проверки номера кредитной карты типа

var match = /^(?:(4[0-9]{12}(?:[0-9]{3})?)|(5[1-5][0-9]{14})|?(6(?:011|5[0-9]{2})[0-9]{12})|(3[47][0-9]{13})|(3(?:0[0-5]|[68][0-9])?[0-9]{11})|((?:2131|1800|35[0-9]{3})[0-9]{11}))$/.exec(cardno);

Ранее этот код работает отлично, но теперь она показывает вышеупомянутая ошибка. Может ли кто-нибудь проверить это и внести какие-либо изменения?

+0

Где находится «ошибка выше»? –

ответ

0

Лучшим методом будет использование теста LUHN. https://en.wikipedia.org/wiki/Luhn_algorithm

/* 
mod10(cardNumber) 
    parameters: 
     this function takes the text string card number and runs the Mod 10 formula on its respective digits. 
    description: 
     Mod 10 is the check digit formula for the supported cards these functions attempt to validate. 
    returns: 
     this function returns true if the number passes the check digit test. 
     false otherwise. 
*/ 
function mod10(cardNumber) { // LUHN Formula for validation of credit card numbers. 
    var ar = new Array(cardNumber.length); 
    var i = 0,sum = 0; 

    for(i = 0; i < cardNumber.length; ++i) { 
     ar[i] = parseInt(cardNumber.charAt(i)); 
    } 
    for(i = ar.length -2; i >= 0; i-=2) { // you have to start from the right, and work back. 
     ar[i] *= 2;      // every second digit starting with the right most (check digit) 
     if(ar[i] > 9) ar[i]-=9;   // will be doubled, and summed with the skipped digits. 
    }        // if the double digit is > 9, ADD those individual digits together 

    for(i = 0; i < ar.length; ++i) { 
     sum += ar[i];     // if the sum is divisible by 10 mod10 succeeds 
    } 
    return (((sum%10)==0)?true:false);  
} 
+0

Проверка luhn (последняя цифра) является, возможно, дополнительной проверкой. Вопросник пытается проверить IIN (первые шесть цифр). Попытка проверить IIN, не понимая, что часто меняются диапазоны IIN, всегда будет подвержена ошибкам, хотя – PaulG

+0

Мне нужно только проверить тип карты ...? –

0

ввести его на http://www.regex101.com и он скажет вам, что знак вопроса в этом фрагменте: 14})|?(6( должен быть удален, так как знак вопроса означает, что маркер предшествующему не является обязательным, но оно предшествует или оператор который не является токеном. Обратите внимание, что это отличается от ?:, что означает группу без захвата.