【问题标题】:Explanation on Credit Card Validation Script信用卡验证脚本说明
【发布时间】:2011-11-04 02:56:04
【问题描述】:

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

签证 = ^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 位数字。

大来俱乐部 = ^3(?:0[0-5]|[68][0-9])[0-9]{11}$

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

【问题讨论】:

标签: javascript


【解决方案1】:

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

如果您真的想验证信用卡号码,您需要确保 校验位(最后一位)与 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 到 em> 8,其中也包括 7。但它没有,所以它排除了 7。

【讨论】:

    【解决方案2】:

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

    例子:

    $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 的单个数字,包括 0 到 9

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

    (?: ... stuff ...) 上面解释过

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

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

    --

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

    |表示OR,所以字符串可以以2131、1800、OR 35

    开头

    \d[0-9] 相同

    【讨论】:

      猜你喜欢
      • 2014-08-14
      • 1970-01-01
      • 2016-04-04
      • 2011-01-24
      • 2012-08-14
      • 2017-04-02
      • 2016-11-15
      • 2020-11-11
      • 1970-01-01
      相关资源
      最近更新 更多