2012-08-11 16 views
5

में क्रेडिट कार्ड भविष्यवाणी मैं एक उपकरण लिख रहा हूं कि ऑनकीडाउन इनपुट बॉक्स में दर्ज होने वाले वर्तमान मूल्य को चलाएगा ताकि यह देखने के लिए कि यह 4 प्रमुख प्रकार के क्रेडिट कार्डों में से किसी एक के लिए रेगेक्स से मेल खाता है या नहीं।जावास्क्रिप्ट

मुझे ऐसा लगता है कि यह काम करता है, लेकिन यह बेहोश है इसलिए मैं यह जानना चाहता था कि यह दोषपूर्ण प्रतिक्रिया देने के कारण क्या था (उदाहरण के लिए कभी-कभी यह एक के बजाय 2 मान आउटपुट करेगा)। ऐसा इसलिए है क्योंकि मुझे लूपिंग से पहले ध्वज चर सेट करने की आवश्यकता है? सही कार्ड के मैच पर, मैंने अभी-अभी वस्तु के माध्यम से लूप से लौट रही है, इसलिए मैंने सोचा कि पर्याप्त होगा ...

regexes के लिए मापदंड this site से खींचा गया:

  • वीज़ा: ^4[0-9]{12}(?:[0-9]{3})?$ सभी वीजा कार्ड नंबर 4 से शुरू होते हैं। नए कार्ड में 16 अंक होते हैं। ^5[1-5][0-9]{14}$ सभी मास्टर कार्ड संबंधी आंकड़े के साथ शुरू 51 55 सभी के माध्यम से 16 अंक है: पुराने कार्ड 13.

  • मास्टरकार्ड है।

  • अमेरिकन एक्सप्रेस: ^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

+0

इसे देखें http://en.wikipedia.org/wiki/Luhn। और फिर यह कार्यान्वयन जेएस https://github.com/jzaefferer/jquery-validation/blob/master/jquery.validate.js#L1129 – elclanrs

+0

पहिया को पुन: पेश नहीं करता है;) – jantimon

उत्तर

4

ऐसा लगता है कि आप एक गलत तरीके से नियमित अभिव्यक्ति का उपयोग कर रहे हैं।

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

की कोशिश करता: आप इसे गलत तरीके से कर रहे हैं

string.match(regexp) // returns boolean 

:

आप एक नियमित अभिव्यक्ति के खिलाफ एक स्ट्रिंग की जांच करना चाहते हैं, तो आप स्ट्रिंग के match() विधि का उपयोग कर सकते हैं एक नियमित अभिव्यक्ति के रूप में वर्तमान मूल्य की व्याख्या करने के लिए। इस तरह से होना चाहिए:

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

ओह डांग। धन्यवाद ... हाँ जो एक स्ट्रिंग के बजाय खुद को रेगेक्स को स्टोर करने के लिए और अधिक समझ में आता है। त्वरित प्रतिक्रिया के लिए धन्यवाद :) –

+0

मुझे 'मिलान' भ्रमित लगता है क्योंकि हर अन्य regexp विधि एक स्ट्रिंग पर regex और 'match' कार्यों पर काम करता है। इस कारण से मैं हमेशा 'मिलान' के बजाय 'exec' का उपयोग करता हूं ->' regex.exec ($ (this) .val()) ' – elclanrs