+ return "Not a credit card" if $number =~ /[^\dx]/io;
+
+ #$number =~ s/\D//g;
+ {
+ local $^W=0; #no warning at next line
+ return "Not a credit card"
+ unless ( length($number) >= 13
+ || length($number) == 8 || length($number) == 9 #Isracard
+ )
+ && 0+$number;
+ }
+
+ return "VISA card" if $number =~ /^4[0-8][\dx]{11}([\dx]{3})?$/o;
+
+ return "MasterCard"
+ if $number =~ /^5[1-5][\dx]{14}$/o
+ ;# || ( $number =~ /^36[\dx]{12}/ && $Country =~ /^(US|CA)$/oi );
+
+ return "American Express card" if $number =~ /^3[47][\dx]{13}$/o;
+
+ return "Discover card"
+ if $number =~ /^30[0-5][\dx]{11}([\dx]{2})?$/o #diner's: 300-305
+ || $number =~ /^3095[\dx]{10}([\dx]{2})?$/o #diner's: 3095
+ || $number =~ /^3[689][\dx]{12}([\dx]{2})?$/o #diner's: 36 38 and 39
+ || $number =~ /^6011[\dx]{12}$/o
+ || $number =~ /^64[4-9][\dx]{13}$/o
+ || $number =~ /^65[\dx]{14}$/o
+ || ( $number =~ /^62[24-68][\dx]{13}$/o && uc($Country) ne 'CN' ) #CUP
+ || ( $number =~ /^35(2[89]|[3-8][\dx])[\dx]{12}$/o && uc($Country) eq 'US' );
+
+ return "Switch"
+ if $number =~ /^49(03(0[2-9]|3[5-9])|11(0[1-2]|7[4-9]|8[1-2])|36[0-9]{2})[\dx]{10}([\dx]{2,3})?$/o
+ || $number =~ /^564182[\dx]{10}([\dx]{2,3})?$/o
+ || $number =~ /^6(3(33[0-4][0-9])|759[0-9]{2})[\dx]{10}([\dx]{2,3})?$/o;
+ #redunant with above, catch 49* that's not Switch
+ return "VISA card" if $number =~ /^4[\dx]{12}([\dx]{3})?$/o;
+
+ #return "Diner's Club/Carte Blanche"
+ # if $number =~ /^3(0[0-59]|[68][\dx])[\dx]{11}$/o;
+
+ #"Diners Club enRoute"
+ return "enRoute" if $number =~ /^2(014|149)[\dx]{11}$/o;
+
+ return "JCB" if $number =~ /^(3[\dx]{4}|2131|1800)[\dx]{11}$/o;
+
+ return "BankCard" if $number =~ /^56(10[\dx][\dx]|022[1-5])[\dx]{10}$/o;
+
+ return "Solo"
+ if $number =~ /^6(3(34[5-9][0-9])|767[0-9]{2})[\dx]{10}([\dx]{2,3})?$/o;
+
+ return "China Union Pay"
+ if $number =~ /^62[24-68][\dx]{13}$/o;
+
+ return "Laser"
+ if $number =~ /^6(304|7(06|09|71))[\dx]{12,15}$/o;
+
+ return "Isracard"
+ if $number =~ /^[\dx]{8,9}$/;