首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >信用卡验证脚本说明

信用卡验证脚本说明
EN

Stack Overflow用户
提问于 2011-11-04 02:56:04
回答 2查看 2.5K关注 0票数 1

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

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.那样处理。

EN

回答 2

Stack Overflow用户

发布于 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。

票数 5
EN

Stack Overflow用户

发布于 2011-11-04 02:58:09

?:的意思是不要将捕获作为匹配结果的一部分(也称为捕获组),基本上忽略这组括号中的内容。

示例:

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

输出:

代码语言:javascript
复制
array(2) {
  [0]=>
  string(16) "4111123456789012"
  [1]=>
  string(3) "012"
}

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

输出:

代码语言:javascript
复制
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]相同

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8004413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档