我正在编写一个工具,该工具会运行onkeydown来运行在输入框中输入的当前值,以检查其是否与4种主要信用卡之一的正则表达式匹配。
我觉得这种方法很有效,但是它很脆弱,所以我想弄清楚是什么原因导致它给出错误的响应(例如,有时它会输出2个值而不是一个值)。是因为我需要在循环之前设置标志变量吗?匹配正确的卡后,我只是从对象中循环返回,所以我认为足够了……
正则表达式的标准是从this site提取的:
^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
最佳答案
似乎您以错误的方式使用了正则表达式。
如果要根据正则表达式检查字符串,可以使用字符串的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()) ) {