5

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

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

正则表达式的标准来自该站点

  • 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 位数字。

  • Discover^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;
            }
        }
    }
    });
    });​
    

这是一个小提琴

4

1 回答 1

4

似乎您以错误的方式使用正则表达式。

如果要根据正则表达式检查字符串,可以使用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()) ) {
于 2012-08-11T21:12:46.000 回答