web-dev-qa-db-ja.com

正規表現のクレジットカード番号のテスト

Regexパターンがクレジットカードに一致するアプリケーションをテストしています。その場合、そのような番号を強調表示する必要があります。私はサイト http://regexpal.com/ を使用して、テスト用のテストクレジットクレジットカード番号を作成しています。私の要件は、それらの間に「-」および/または「、」を含むことができる有効なクレジットカード番号を持つことです。

http://regexpal.com

以下のシナリオでクレジット番号はほとんど必要ありません

  1. 任意の数字の間に「-」を含めることができる有効なクレジットカード番号。
  2. 任意の数字の間に「、」を含めることができる有効なクレジットカード番号。
  3. 任意の数字の間に「、」または「-」を組み合わせた有効なクレジットカード番号。
42
user1209784

最初に、文字列から_,_および_-_およびその他の非数字をすべて削除します。

次に、Visa、MasterCard、American Express、Diners Club、Discover、およびJCBカードに一致する次の正規表現を使用します。

^(?:4[0-9]{12}(?:[0-9]{3})?|[25][1-7][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$

51

一般的なクレジットカードベンダーの正規表現:

  • Amexカード:_^3[47][0-9]{13}$_
  • BCGlobal:^(6541|6556)[0-9]{12}$
  • カルテブランシュカード:_^389[0-9]{11}$_
  • ダイナースクラブカード:^3(?:0[0-5]|[68][0-9])[0-9]{11}$
  • カードを発見:^65[4-9][0-9]{13}|64[4-9][0-9]{13}|6011[0-9]{12}|(622(?:12[6-9]|1[3-9][0-9]|[2-8][0-9][0-9]|9[01][0-9]|92[0-5])[0-9]{10})$
  • インスタ支払いカード:_^63[7-9][0-9]{13}$_
  • JCBカード:^(?:2131|1800|35\d{3})\d{11}$
  • KoreanLocalCard:_^9[0-9]{15}$_
  • レーザーカード:^(6304|6706|6709|6771)[0-9]{12,15}$
  • マエストロカード:^(5018|5020|5038|6304|6759|6761|6763)[0-9]{8,15}$
  • マスターカード:^(5[1-5][0-9]{14}|2(22[1-9][0-9]{12}|2[3-9][0-9]{13}|[3-6][0-9]{14}|7[0-1][0-9]{13}|720[0-9]{12}))$
  • ソロカード:^(6334|6767)[0-9]{12}|(6334|6767)[0-9]{14}|(6334|6767)[0-9]{15}$
  • スイッチカード:^(4903|4905|4911|4936|6333|6759)[0-9]{12}|(4903|4905|4911|4936|6333|6759)[0-9]{14}|(4903|4905|4911|4936|6333|6759)[0-9]{15}|564182[0-9]{10}|564182[0-9]{12}|564182[0-9]{13}|633110[0-9]{10}|633110[0-9]{12}|633110[0-9]{13}$
  • ユニオンペイカード:^(62[0-9]{14,17})$
  • Visaカード:^4[0-9]{12}(?:[0-9]{3})?$
  • Visaマスターカード:^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14})$
155
ajithparamban

Rupayデビットカードの場合:^6[0-9]{15}$

7
Aditya Rao

受け入れられた答えは素晴らしいですが、新しいMasterCard BINに対応するには、次のように更新する必要があると思います。

^(?:4[0-9]{12}(?:[0-9]{3})?|[25][1-7][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$

(重要な部分は[25][1-7][0-9]{14}、1桁目は2または5になり、2桁目は最大7になるため)

私が間違っている場合は私を修正してください!

7
skwidbreth

2019年

DO。ない。つかいます。 REGEX !!!(感嘆符3つ付き)


コメントから、PeteWiFiのコメントを強調する必要があります。

この方法で特定のスキームとカードの長さを一致させようとすると、わかりやすい警告が表示されます。たとえば、スイッチは2002年以降存在せず、レーザーは2014年に撤回され、Visaは19桁のカードを発行する予定であり、MasterCardは2xxxxxの範囲で発行される予定です。正規表現は、基本的な「カード番号のように見えます」には適していますが、それ以上のことはありません。

視覚的な用途(VISAのロゴまたはラベルを表示)のためにカードブランドを知るためだけに正規表現を使用する場合は、それで問題ありません。ただし、コードロジックがそれに依存している場合は、正規表現を使用しないでください。また、サードパーティのプラグイン/ライブラリを使用しないでください。

Regexによるカード番号の検出は迅速かつ簡単です(とても魅力的です!)。しかし、長期的には、プロジェクトは多くの深刻で解決が難しいバグに直面します。カード発行会社は、新しいカード番号パターンを導入し続けるか、古いカード番号パターンを撤回するか、完全に閉鎖する場合があります。知るか。


解決

wikipediaのこのページ のような頻繁に更新されるいくつかの公式ページに基づいて、独自のソリューション(できれば正規表現以外)を構築します。

「-」、「。」、「スペース」、およびその他のすべてのノイズについては、これらの非数字をすべて削除するだけで、これを使用できます(これに基づいて answer )。

$number = preg_replace("/[^0-9]/", "", "4111-1111 1111.1111");
// Output: 4111111111111111

まだ納得していませんか?

このページでは、なぜ正規表現が地獄にあるのか、技術的な詳細を詳しく説明しています 。 (アーティクルは「地獄」という言葉を使用していることに注意してください。一度入ると外に出られないからです)

2
evilReiko

RupayカードのRegx:

(508 [5-9] [0-9] {12})|(6069 [8-9] [0-9] {11})|(607 [0-8] [0-9] {12}) |(6079 [0-8] [0-9] {11})|(608 [0-5] [0-9] {12})|(6521 [5-9] [0-9] {11} )|(652 [2-9] [0-9] {12})|(6530 [0-9] {12})|(6531 [0-4] [0-9] {11})

ビンシリーズの使用:508500 – 508999、606985 – 606999、607000-607899、607900-607984、608001-608500、652150 --- 652199、652200 --- 652999、653000 --- 653099、653100 --- 653149、

1
Padam Singh

上記のすべてに加えて、2221-2720個のBINを含む新しいMasterCardの正規表現を次に示します。

^5[1-5][0-9]{0,14}|^(222[1-9]|2[3-6]\\d{2}|27[0-1]\\d|2720)[0-9]{0,12}

ユーザーがMasterCardに対応するカード番号の入力を開始すると、この正規表現が一致することに注意してください。たとえば、ユーザーが"222185"と入力すると、"2221"で始まる他のタイプのカードがないため、正規表現が一致します。この正規表現は、カードの最初の数字を入力するときにカードの種類を表示する場合に便利です。

あるいは、"post factum"マッチングが必要な場合は、最後の部分を{0,14}および{0,12}から{14}および{12}

^5[1-5][0-9]{14}|^(222[1-9]|2[3-6]\\d{2}|27[0-1]\\d|2720)[0-9]{12}
1
azizbekian

大手カードネットワークの正規表現

マスターカード(2-ビン、5-ビン両方): "(?: 5 [1-5] [0-9] {2} | 222 [1-9] | 22 [3- 9] [0-9] | 2 [3-6] [0-9] {2} | 27 [01] [0-9] | 2720)[0-9] {12} "

Visa: "^ 4 [0-9] {6、} $"

ダイナーズクラブ: "(^ 30 [0-5] [0-9] {11} $)|(^(36 | 38)[0-9] {12} $)"

American Express: "^ [34 | 37] [0-9] {14} $"

[〜#〜] jcb [〜#〜]: "(^ 3 [0-9] {15} $)|(^(2131 | 1800)[0-9] {11} $ )」

検出: "^ 6011-?\ d {4}-?\ d {4}-?\ d {4} $"

0
Ripudaman Singh

ダッシュとスペースを許可する正規表現を思いつきました。ここでテストしてください: https://regex101.com/r/Rx2iWD/1

コンマ(これは珍しいと思う)を許可するには、sep定義に追加します。

PHPの場合:

$ccPatt = '/
    (?(DEFINE)
        (?<sep> [ -]?)
    )
    (?<!\d)(?:
      \d{4} (?&sep) \d{4} (?&sep) \d{4} (?&sep) \d{4}               # 16 digits
    | \d{3} (?&sep) \d{3} (?&sep) \d{3} (?&sep) \d (?&sep) \d{3}    # 13 digits
    | \d{4} (?&sep) \d{6} (?&sep) \d{4}                             # 14 digits
    | \d{4} (?&sep) \d{6} (?&sep) \d{5}                             # 15 digit card
    )(?!\d)
/xu';
0
mpen

First Dataは、Amexの場合は15桁、visa、mc、discover、diners、jcbの場合は16桁を検証するため、これを使用して長さが15桁または16桁の場合にのみカード番号を送信します。

^[0-9]{15}(?:[0-9]{1})?$
0
Bolo