我想知道用于验证主要信用卡的每个字符的解释。我用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位数字。这些是大莱卡和万事达卡之间的合资企业,应该像万事达卡一样处理。
答案 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]