信用卡验证脚本说明

时间:2011-11-04 02:56:05

标签: javascript

我想知道用于验证主要信用卡的每个字符的解释。我用Google搜索并找到了以下解释,但它们并没有完全解释它(例如?:是什么意思?等等)

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位

JCB = ^(?:2131|1800|35\d{3})\d{11}$

以2131或1800开头的JCB卡有15位数字。以35开头的JCB卡有16位数字。

Diners Club = ^3(?:0[0-5]|[68][0-9])[0-9]{11}$

Diners Club卡号从300到305,36或38开头。所有都有14位数字。 Diners Club卡以5开头,有16位数字。这些是大莱卡和万事达卡之间的合资企业,应该像万事达卡一样处理。

2 个答案:

答案 0 :(得分:5)

您提供的规则实际上并未完全验证信用卡号,他们只是检查正确的位数。

如果你真的想验证信用卡号码,你需要确保的校验位的(最后一位),根据数量的其他部分相匹配的Luhn algorithm - 更多信息以及Javascript中的工作代码是available here。使用您提供的正则表达式,4000000000000000被视为有效的VISA卡号,但当您检查校验位时,它不是。

解释您提供的正则表达式:

^表示字符串的开头,$表示结束。这些必须始终用于锚定正则表达式,除非您希望它匹配较大字符串的子字符串。

[0-9]表示任何数字(0到9或其间的任何数字)。你也可以使用\d(你的其他一个例子)。 \d是一个特殊字符,意思是“任何数字”。还有其他一些特殊字符,例如\s,意思是“任何空白字符”。

{12}表示重复前一个字母或括号模式12次(不多也不少)。

(?:刚开始括号模式。 (?:(之间的区别在于(?:不会捕获稍后检索的模式(使用后引用)。这些示例都没有使用反向引用,因此(?:很好(并且通常更有效)。

)结束了括号模式。括号模式只是用于将多个字母/模式放入一个组中。

?表示前一个字母或括号模式是可选 - 它可以是0或1次。顺便说一下,{0,1}会做同样的事情。

其余部分非常明显,除了:

[68],这意味着或者 6 8.如果它在那里一个破折号,例如[6-8],这将意味着6 8,其中也包括7。但它没有,所以它排除了7。

答案 1 :(得分:1)

?:表示不作为匹配结果的一部分进行捕获(又名捕获组),基本上忽略了这组括号中的内容。

示例:

$matches = array();
$card = '4111123456789012';
if (preg_match('/^4[0-9]{12}([0-9]{3})?$/', $card, $matches)) {
    var_dump($matches);
}
echo "\n";

输出:

array(2) {
  [0]=>
  string(16) "4111123456789012"
  [1]=>
  string(3) "012"
}

VS

$matches = array();
$card = '4111123456789012';
if (preg_match('/^4[0-9]{12}(?:[0-9]{3})?$/', $card, $matches)) {
    var_dump($matches);
}
echo "\n";

输出:

array(1) {
  [0]=>
  string(16) "4111123456789012"
}

注意第二个例子中$matches[1]不存在?那是因为你说(?: ...stuff here...)并且没有抓住它。

-

^4[0-9]{12}(?:[0-9]{3})?$

^表示字符串开始匹配此模式。

4文字字符串4

[0-9] 0到9的单个数字,包括

{12}是前一个字符/组的修饰符。在这种情况下,[0-9]{12}正好表示12位数

上面解释了

(?: ... stuff ...)

?是前一个字符/组的修饰符。在这种情况下,(...)?括号中的零或1。

$表示匹配字符串的结尾。

-

^(?:2131|1800|35\d{3})\d{11}$

|表示OR,因此字符串可以以2131,1800, OR 35

开头

\d[0-9]

相同