我正在编写一个工具,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; } } } }); });