有時候走火入魔就是這樣,前篇還在寫我正在研究 Regular Expression 玩數字檢查,結果看到信用卡號碼檢查有很多人提出不同的方法,我找到一篇國外的文章,寫得很詳盡,就想給它翻譯怕自己忘了原理。
此篇原文 Regex: Credit Card Numbers 內容介紹了世界各地金融網路發行的卡片及編碼形成方式,並且提供了 RegEx 的方法,由於這涉及了非常多的銀行專業知識,很多專有名詞及用語很艱深,我目前翻譯得很辛苦,但若有急用的人,不妨參考以下我節錄的幾個比較常見的卡號驗證方式。
Visa 卡
基本的驗證卡號長度對不對,範例卡號 "4012888888881881"
^4\d{15}$
驗證含有空白或破折號分隔形成的卡號,範例卡號 "4012-8888-8888-1881"
^4\d{3}([\ \-]?)\d{4}\1\d{4}\1\d{4}$
Master 萬事達卡
基本的驗證卡號長度對不對,範例卡號 "5111005111051128"
^5[1-5]\d{14}$
驗證含有空白或破折號分隔形成的卡號
^5[1-5]\d{2}([\ \-]?)\d{4}\1\d{4}\1\d{4}$
American Express 美國運通卡
基本的驗證卡號長度對不對,範例卡號 "371449635398431"
^3[47]\d{13}$
驗證含有空白或破折號分隔形成的卡號,範例卡號 "3714-496353-98431"
^3[47]\d\d([\ \-]?)\d{6}\1\d{5}$
Discover
基本的驗證卡號長度對不對,範例卡號 "6011000990139424"
^6(?:011\d\d|5\d{4}|4[4-9]\d{3}|22(?:1(?:2[6-9]|[3-9]\d)|[2-8]\d\d|9(?:[01]\d|2[0-5])))\d{10}$
驗證含有空白或破折號分隔形成的卡號
^6(?:011|22(?:1(?=[\ \-]?(?:2[6-9]|[3-9]))|[2-8]|9(?=[\ \-]?(?:[01]|2[0-5])))|4[4-9]\d|5\d\d)([\ \-]?)\d{4}\1\d{4}\1\d{4}$
Diner’s Club International (DCI) 已經被 Discover 吃了,所以 DCI 卡可能在其他文章有提到,但其實現在都被歸為 Discover。
JCB
基本的驗證卡號長度對不對,範例卡號 "3566002020360505"
^35(?:2[89]|[3-8]\d)\d{12}$
驗證含有空白或破折號分隔形成的卡號
^35(?:2[89]|[3-8]\d)([\ \-]?)\d{4}\1\d{4}\1\d{4}$
UnionPay (中國銀聯)
基本的驗證卡號長度對不對,範例卡號 "6212341111111111111"
^62[0-5]\d{13,16}$
Maestro
基本的驗證卡號長度對不對,範例卡號 "5019717010103742"
^(?:5[0678]\d\d|6304|6390|67\d\d)\d{8,15}$
愛爾蘭的Laser卡也屬於 Maestro
參考連結
以上所提供的 RegEx 語法其實大概只有原文所提的一半而已,若需要更完整的可以看以下連結
- 原文連結 : http://www.richardsramblings.com/regex/credit-card-numbers/
- 我將原文轉 MarkDown 連結 : https://github.com/pigochu/pigo-learn/blob/master/php-regular-expressions/credit-card-numbers.md
- 我將原文轉 MarkDown 翻譯 : https://github.com/pigochu/pigo-learn/blob/master/php-regular-expressions/credit-card-numbers-zh_TW.md (翻譯的部分目前沒有時程,看心情,看我有沒那個能力 @@)