Javascript中的信用卡预测

Javascript中的信用卡预测,javascript,jquery,credit-card,Javascript,Jquery,Credit Card,我正在编写一个工具,onkeydown将运行输入框中输入的当前值,以检查它是否与4种主要信用卡类型之一的正则表达式匹配 我觉得它可以工作,但它很脆弱,所以我想找出是什么原因导致它给出错误的响应(例如,有时它会输出2个值而不是1个值)。是因为我需要在循环之前设置一个标志变量吗?在匹配正确的卡片后,我只是从循环中通过对象返回,所以我认为这足够了 正则表达式的标准来自: Visa:^4[0-9]{12}(?[0-9]{3})?$所有Visa卡号都以4开头。新卡有16位数字。旧卡有13张 万事达卡:^

我正在编写一个工具,onkeydown将运行输入框中输入的当前值,以检查它是否与4种主要信用卡类型之一的正则表达式匹配

我觉得它可以工作,但它很脆弱,所以我想找出是什么原因导致它给出错误的响应(例如,有时它会输出2个值而不是1个值)。是因为我需要在循环之前设置一个标志变量吗?在匹配正确的卡片后,我只是从循环中通过对象返回,所以我认为这足够了

正则表达式的标准来自:

  • Visa
    ^4[0-9]{12}(?[0-9]{3})?$
    所有Visa卡号都以4开头。新卡有16位数字。旧卡有13张

  • 万事达卡
    ^5[1-5][0-9]{14}$
    所有万事达卡号码都以数字51到55开头。都有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;
            }
        }
    }
    });
    });​
    
  • 美国运通
    ^3[47][0-9]{13}$
    美国运通卡号以34或37开头,有15位数字

  • 发现
    ^6(?:011 | 5[0-9]{2})[0-9]{12}$
    发现卡号以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;
            }
        }
    }
    });
    });​
    

看来您使用正则表达式的方式不对

如果要根据正则表达式检查字符串,可以使用字符串的
match()
方法:

string.match(regexp) // returns boolean
你做得不对:

if ( regex.match($(this).val()) ) {
尝试将当前值解释为正则表达式。必须这样做:

if ( $(this).val().match(regex) ) {

您还可以缓存正则表达式以提高脚本的效率:

ccMap.cards = {
    'amex': /^3[47][0-9]{13}$/,  // store an actual regexp object, not a string
    // ...

// The way you test changes, now you're able to use the "test"
// method of the regexp object:
if ( regex.test($(this).val()) ) {

你在别的地方做错了什么。登录到控制台后,您将退出过程/结束循环,因此不可能输出两条日志行。请检查此项。然后这个实现就是JS,我希望是
/^3[47][0-9]{13)$/
公平地说,我认为他们在进行卡片类型匹配,而不是luhn检查,因此这并不是真正的重新发明轮子。也就是说,既然你也需要luhn检查,而且它需要旋转以确保每个字符都是数字,我会使用一些luhn代码,然后在其上添加长度和前缀检查,而不是这种方法@mplungjan谢谢,我已经更改了我的正则表达式以遵循这种格式。是的,这基本上只是为了显示信用卡的图像。实际的验证是在服务器端进行的,所以我认为甚至不需要Luhn。感谢github链接。噢,当。谢谢…是的,存储正则表达式本身比存储正则表达式更有意义字符串。感谢您的快速响应:)我发现
match
令人困惑,因为所有其他regexp方法都适用于regex,而
match
适用于字符串。我总是使用
exec
而不是
match
,因此-->
regex.exec($(this.val())