我们都知道42 是所有问题的答案,但对我来说它是一个有效的信用卡号是个新闻。
尝试在此jQuery 验证测试页面中输入“42”或“42176” ,然后单击“确定”。
这是怎么回事?我认为这应该是事实上的验证库。连微软现在都在用它,但它认为“42”和“42176”是有效的信用卡号?!它甚至没有进行长度检查。当然我也不负责添加长度检查吗?它被称为“信用卡”验证器,而不是“luhn”验证器。
编辑:除了搭便车的幽默-我将如何修补验证插件以检查长度。那容易吗?
我们都知道42 是所有问题的答案,但对我来说它是一个有效的信用卡号是个新闻。
尝试在此jQuery 验证测试页面中输入“42”或“42176” ,然后单击“确定”。
这是怎么回事?我认为这应该是事实上的验证库。连微软现在都在用它,但它认为“42”和“42176”是有效的信用卡号?!它甚至没有进行长度检查。当然我也不负责添加长度检查吗?它被称为“信用卡”验证器,而不是“luhn”验证器。
编辑:除了搭便车的幽默-我将如何修补验证插件以检查长度。那容易吗?
这可能是因为此验证器仅检查提供的数字是否满足LUHN-10算法(42 满足,因为 4*2 + 2 = 10 是 0 模 10)。
一个更好的验证器可能应该检查最少的位数。
我不确定这是否对应于 jQuery 的最新代码,但我发现了与信用卡验证相关的代码段:
// http://docs.jquery.com/Plugins/Validation/Methods/creditcard
// based on http://en.wikipedia.org/wiki/Luhn
creditcard: function(value, element) {
if ( this.optional(element) )
return "dependency-mismatch";
// accept only digits and dashes
if (/[^0-9-]+/.test(value))
return false;
var nCheck = 0,
nDigit = 0,
bEven = false;
value = value.replace(/\D/g, "");
for (n = value.length - 1; n >= 0; n--) {
var cDigit = value.charAt(n);
var nDigit = parseInt(cDigit, 10);
if (bEven) {
if ((nDigit *= 2) > 9)
nDigit -= 9;
}
nCheck += nDigit;
bEven = !bEven;
}
return (nCheck % 10) == 0;
},
...正如您所看到的,这仅检查所有字符是否为数字并且满足 LUHN-10,而无需注意最小长度。
您可以将信用卡规则与最小和最大长度规则结合起来,以达到您想要的效果。这可能看起来太费力了——我可能同意——尽管如果你只想接受某些卡号长度,它确实会给你更多的控制权。
$('form').validate({
'#ccNum': {
creditcard: true,
required: true,
minlength: 13,
maxlength: 19
}
});
信用卡号码的长度可能因发卡机构而异(虽然是的,但通常最短长度约为 13 位数字)。但是,由于这是客户端验证,因此重点可能更多的是减少出现小错字的机会,而不是检查任意数据。这可能应该在服务器端完成。
我已经更正了 jQuery 验证函数以在验证中考虑信用卡长度。
我在信用卡验证码中添加了以下内容-
if (value.length > 19 || value.length<12)
{
return (false);
}
信用卡验证部分的完整代码如下:-
creditcard: function(value, element) {
if ( this.optional(element) )
return "dependency-mismatch";
// accept only digits and dashes
if (/[^0-9-]+/.test(value))
return false;
// Modified part to check minimum and maximum card length
if (value.length > 19 || value.length<12)
{
return (false);
}
var nCheck = 0,
nDigit = 0,
bEven = false;
value = value.replace(/\D/g, "");
for (n = value.length - 1; n >= 0; n--) {
var cDigit = value.charAt(n);
var nDigit = parseInt(cDigit, 10);
if (bEven) {
if ((nDigit *= 2) > 9)
nDigit -= 9;
}
nCheck += nDigit;
bEven = !bEven;
}
return (nCheck % 10) == 0;
},
我将最小和最大卡片长度分别硬编码为 12 和 19。