2012-08-11 19 views
5

我正在寫一個工具,onkeydown將運行輸入框中輸入的當前值,以檢查它是否與4種主要類型的信用卡之一的正則表達式匹配。Javascript中的信用卡預測

我覺得它是一種工作,但它很脆弱,所以我想弄清楚是什麼導致它給出錯誤的響應(例如有時會輸出2個值而不是1個)。是因爲我需要在循環之前設置一個標誌變量?在正確的卡的比賽,我只是從通過對象循環回來,所以我想會是足以...

的正則表達式的標準是從this site拉:

  • 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開頭。全部都有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; 
         } 
        } 
    } 
    }); 
    });​ 
    

Here's a fiddle

+0

你在其他地方做得不對。登錄到控制檯後,您退出過程/結束循環,因此不會輸出兩個日誌行。 – SJuan76 2012-08-11 21:06:05

+0

請查看http://en.wikipedia.org/wiki/Luhn。然後這個實現是JS https://github.com/jzaefferer/jquery-validation/blob/master/jquery.validate.js#L1129 – elclanrs 2012-08-11 21:11:38

+0

不要重新發明輪子;) – jantimon 2012-08-11 21:13:21

回答

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())) { 
+0

Oh dang。謝謝...是的,更有意義的存儲正則表達式本身,而不是一個字符串。感謝您的快速響應:) – 2012-08-11 21:24:08

+0

我發現'match'令人困惑,因爲每個其他的regexp方法在正則表達式上工作,'match'在一個字符串上工作。由於這個原因,我總是使用'exec'而不是'match' - >'regex.exec($(this).val())' – elclanrs 2012-08-11 21:32:40