Symfony 1.4 的信用卡验证器

Posted

技术标签:

【中文标题】Symfony 1.4 的信用卡验证器【英文标题】:Credit Card validator for Symfony 1.4 【发布时间】:2011-09-10 04:19:32 【问题描述】:

有人在 Symfony 1.4 中使用有效的信用卡号码验证器吗?

我通过http://brentertainment.com/2009/09/01/some-helpful-symfony-form-validators/ 找到了https://gist.github.com/181049,但至少 switch 正则表达式模式似乎肯定被破坏了,并且可能 jcb / enroute 也是如此。

我认为问题在于它在尝试匹配前缀时使用方括号而不是括号,但如果它被破坏了,那么它会让我怀疑验证器的其余部分。

/^[4903|4911|4936|5641|6333|6759|6334|6767]\d12$/

应该是

/^(4903|4911|4936|5641|6333|6759|6334|6767)\d12$/

是否有人在生产中使用了有效且经过测试的验证器?最好用英国卡?

【问题讨论】:

【参考方案1】:

RegexBuddy 库建议如下:

^(?:4\d3[ -]*\d4[ -]*\d4[ -]*\d(?:\d3)?|5[1-5]\d2[ -]*\d4[ -]*\d4[ -]*\d4|6(?:011|5[0-9]2)[ -]*\d4[ -]*\d4[ -]*\d4|3[47]\d2[ -]*\d6[ -]*\d5|3(?:0[0-5]|[68][0-9])\d[ -]*\d6[ -]*\d4|(?:2131|1800)[ -]*\d6[ -]*\d5|35\d2[ -]*\d4[ -]*\d4[ -]*\d4)$

以上将匹配所有信用卡,例如以下示例:

Visa
4123456789012345
4123 4567 8901 2345
4123-4567-8901-2345

MasterCard
5123456789012345
5123-4567-8901-2345
5123 4567 8901 2345

Discover
6011123456789012
6011-1234-5678-9012
6011 1234 5678 9012

American Express
341234567890123
3412 345678 90123
3412-345678-90123

Diner's Club
30012345678901
3001 234567 8901
3001-234567-8901

JCB
213112345678901
2131 123456 78901
2131-123456-78901
3512345678901234
3512 3456 7890 1234
3512-3456-7890-1234

【讨论】:

【参考方案2】:

我会远离美国正则表达式,该示例省略了许多有效前缀:Visa DR 为 40*,Visa/Electron 为 48*,solo 为 35*。

对于大多数方案,长度也可以跨越 16-19 位,因此长度限制不正确。

BIN 前缀(第 1 位 6)会定期修改(添加/取消/免除电子通信的范围),并且在较小程度上,第 4 位也是如此,因此您可能希望依赖第 1 位数字 &而是进行 LUHN 检查。

如果您在英国; http://www.barclaycard.co.uk/business/documents/pdfs/bin_rules.pdf

【讨论】:

以上是关于Symfony 1.4 的信用卡验证器的主要内容,如果未能解决你的问题,请参考以下文章

设置器中的 Symfony 验证器服务和 TypeErrors

Symfony2中组序列验证器的问题

Symfony 验证器的注释返回“注释从未导入异常”

基于其他约束的 Symfony 自定义验证器

Symfony2验证器约束大于其他属性

如何在 symfony2 验证器中允许空值