我想知道每个用于验证主要信用卡的字符的解释。我搜索并找到了以下解释,但它们并不完全解释(例如,?:是什么意思?)等人)
VISA = ^4[0-9]{12}(?:[0-9]{3})?$
所有维萨卡号码以4开头,新卡有16位数。旧卡有13.
万事达卡= ^5[1-5][0-9]{14}$
所有的MasterCard数字都从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位数。
食客俱乐部= ^3(?:0[0-5]|[68][0-9])[0-9]{11}$
食客俱乐部的卡号从300到305,36或38开始。都有14位数。有食客俱乐部卡,以5开头,有16位数。这是食客俱乐部和MasterCard的合资公司,应该像MasterCard.那样处理。
发布于 2011-11-04 03:09:48
您所提供的规则实际上并不能完全验证信用卡号码,它们只是检查正确的数字数。
如果您真的想验证信用卡号码,则需要确保检查数字(最后一个数字)与Luhn算法中的其余数字相匹配--更多信息,而Javascript中的工作代码是可在这里找到。使用您提供的正则表达式,4000000000000000被视为有效的VISA卡号,但是当您检查检查数字时,它不是。
要解释您提供的正则表达式:
^表示字符串的开头,$表示结束。除非您希望正则表达式与较大字符串的子字符串匹配,否则必须始终使用这些参数来锚定正则表达式。
[0-9]是指任何数字(0到9或两者之间的任何东西)。您也可以为此使用\d (其他示例中的一个就是这样做的)。\d是一个特殊的字符,意思是“任何数字”。还有其他几个这样的特殊字符,比如\s,意思是“任意空格字符”。
{12}的意思是重复上一个字母或括号内的模式12次(不多,也不少)。
(?:刚刚开始一个括号内的模式。(?:和(的不同之处在于,(?:没有捕获模式以供以后检索(使用反向引用)。这些示例中没有一个使用反向引用,因此(?:很好(而且通常效率更高)。
)结束了括号内的模式。括号内的图案仅用于将多个字母/模式放入一个组中。
?意味着前一个字母或括号内的图案是可选的--它可以是0次也可以是1次。顺便说一句,{0,1}也会做同样的事情。
其他的都是很清楚的,除了:
[68],意思是6或8。如果它有一个破折号,比如[6-8],它意味着6到8,其中也包括7。但它没有,所以它不包括7。
发布于 2011-11-04 02:58:09
?:的意思是不要将捕获作为匹配结果的一部分(也称为捕获组),基本上忽略这组括号中的内容。
示例:
$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"
}与
$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 ...)在上面解释了
?是前一个字符/组的修饰符。在这种情况下,(...)?为0或括号中的1。
$表示匹配字符串的结尾。
--
在^(?:2131|1800|35\d{3})\d{11}$中
|表示OR,所以字符串可以从2131,1800,或 35开始
\d与[0-9]相同
https://stackoverflow.com/questions/8004413
复制相似问题