Javascript中的信用卡预测

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

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

正则表达式的标准是从这个网站中提取的:

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

  • 万事达卡^5[1-5][0-9]{14}$所有的万事达卡号码都以数字51到55开头。所有卡号都有16位数字。

  • 美国运通^3[47][0-9]{13}$美国运通卡号码以34或37开头,并有15位数字。

  • 发现^6(?:011|5[0-9]{2})[0-9]{12}$发现卡号以6011或65开头。

    $(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()) ) {
    
    链接地址: http://www.djcxy.com/p/70723.html

    上一篇: Credit card prediction in Javascript

    下一篇: credit card validation using Luhn's