5

onkeydown が入力ボックスに入力されている現在の値を実行して、4 つの主要な種類のクレジット カードのいずれかの正規表現と一致するかどうかを確認するツールを作成しています。

私はそれがうまくいっているように感じますが、それは不安定なので、何が間違った応答を与える原因を突き止めたかったのです (たとえば、1 つではなく 2 つの値を出力することがあります)。ループする前にフラグ変数を設定する必要があるからですか? 正しいカードが一致すると、オブジェクトを介してループから戻るだけなので、それで十分だと思いました...

正規表現の基準は、次のサイトから取得されました。

  • Visa :^4[0-9]{12}(?:[0-9]{3})?$すべての Visa カード番号は 4 で始まります。新しいカードは 16 桁です。古いカードは 13 です。

  • MasterCard :^5[1-5][0-9]{14}$すべての MasterCard 番号は 51 ~ 55 の数字で始まります。すべて 16 桁です。

  • American Express : ^3[47][0-9]{13}$American Express カード番号は 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 に答える