CreditCardDetector   A
last analyzed

Complexity

Total Complexity 3

Size/Duplication

Total Lines 34
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 2
Bugs 0 Features 1
Metric Value
eloc 20
c 2
b 0
f 1
dl 0
loc 34
ccs 5
cts 5
cp 1
rs 10
wmc 3

1 Method

Rating   Name   Duplication   Size   Complexity  
A detect() 0 9 3
1
<?php
2
3
namespace Larium\CreditCard;
4
5
class CreditCardDetector
6
{
7
    private static $cardPatterns = [
8
        CreditCard::VISA               => '/(^4\d{12}(\d{3})?$)|(^4\d{12}(\d{6})?$)/',
9
        CreditCard::MASTER             => '/^((5[1-5]\d{4}|677189)\d{10})|(2(?:2(?:2[1-9]|[3-9]\d)|[3-6]\d\d|7(?:[01]\d|20))-?\d{4}-?\d{4}-?\d{4})$/',
10
        CreditCard::DISCOVER           => '/^6(?:011\d{12}|5\d{14}|4[4-9]\d{13}|22(?:1(?:2[6-9]|[3-9]\d)|[2-8]\d{2}|9(?:[01]\d|2[0-5]))\d{10})$/',
11
        CreditCard::UNIONPAY           => '/^62[0-9]\d{13,16}$/',
12
        CreditCard::AMEX               => '/^3[47]\d{13}$/',
13
        CreditCard::DINERS_CLUB        => '/^(3((?:0[0-5])|(?:09)|(?:6[0-9])|(?:8[0-9])|(?:9[0-9]))\d{11}|2014\d{11}|2149\d{11})$/',
14
        CreditCard::JCB                => '/^35(28|29|[3-8]\d)\d{12}$/',
15
        CreditCard::MIR                => '/^22(00|01|02|03|04)\d{12,15}$/',
16
        CreditCard::DANKORT            => '/^5019\d{12}$/',
17
        CreditCard::MAESTRO            => '/(?:5018|5020|5038|5612|5892|5893|6304|6759|6761|6762|6763|0604|6390)[0-9]{8,15}/',
18
        CreditCard::FORBRUGSFORENINGEN => '/^600722\d{10}$/',
19
        CreditCard::LASER              => '/^(6706|6771|6709)\d{8}(\d{4}|\d{6,7})?$/',
20
        CreditCard::SWITCH_BRAND       => '/^6759\d{12}(\d{2,3})?$/',
21
        CreditCard::SOLO               => '/^6767\d{12}(\d{2,3})?$/',
22
    ];
23
24
    /**
25
     * Detect card brand from card number
26
     *
27
     * @param string $number The card number to detect.
28
     * @return string Card name on success or empty string if not.
29
     */
30 247
    public function detect(string $number): string
31
    {
32 247
        foreach (self::$cardPatterns as $name => $pattern) {
33 247
            if (preg_match($pattern, $number)) {
34 238
                return $name;
35
            }
36
        }
37
38 10
        return '';
39
    }
40
}
41