Passed
Branch master (5b5427)
by kouinkouin
02:14
created

StreetParser   A

Complexity

Total Complexity 9

Size/Duplication

Total Lines 99
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 0

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
wmc 9
lcom 1
cbo 0
dl 0
loc 99
ccs 23
cts 23
cp 1
rs 10
c 0
b 0
f 0

4 Methods

Rating   Name   Duplication   Size   Complexity  
A getStreetDataFromFullStreet() 0 14 3
B getRegexLines() 0 33 1
A getLineResult() 0 8 2
A getMatchResult() 0 18 3
1
<?php
2
3
namespace kouinkouin\StreetParser;
4
5
class StreetParser
6
{
7
    /**
8
     * @param string $fullStreet
9
     *
10
     * @return array
11
     */
12 10
    public function getStreetDataFromFullStreet($fullStreet)
13
    {
14 10
        $bestResult = ['score' => -1];
15
16 10
        foreach ($this->getRegexLines() as $regexLine) {
17 10
            $result = $this->getLineResult($regexLine, $fullStreet);
18
19 10
            if ($result['score'] > $bestResult['score']) {
20 10
                $bestResult = $result;
21
            }
22
        }
23
24 10
        return $bestResult;
25
    }
26
27
    /**
28
     * @return array
29
     */
30 10
    private function getRegexLines()
31
    {
32
        // Use https://www.regex101.com to debug regex :)
33
        return [
34
            [
35 10
                'regex'  => '/(.*)/', // basic
36
                'street' => 1,
37
                'number' => -1,
38
                'box'    => -1,
39
            ],
40
            // Belgian format. "," mandatory to separate the street and the number+box
41
            [
42
                'regex'  => '/^(.*\w)\ *\,\ *(\d+\w*)[\/\ ]*(\d*\w*)$/',
43
                'street' => 1,
44
                'number' => 2,
45
                'box'    => 3,
46
            ],
47
            // Belgian format. Without "," to separate the street and the number. Don't detect the box
48
            [
49
                'regex'  => '/^(.*[a-zA-Z])\ *(\d+\w*)([\/\ ]*)(\d*\w*)$/',
50
                'street' => 1,
51
                'number' => 2,
52
                'box'    => -1,
53
            ],
54
            // Belgian format. Without "," to separate the street and the number. Don't detect the box
55
            [
56
                'regex'  => '/^(.*[a-zA-Z])\ *(\d+\w*)[\/\ ]+(\d+\w*)$/',
57
                'street' => 1,
58
                'number' => 2,
59
                'box'    => 3,
60
            ],
61
        ];
62
    }
63
64
    /**
65
     * @param array  $regexLine
66
     * @param string $fullStreet
67
     *
68
     * @return array
69
     */
70 10
    private function getLineResult($regexLine, $fullStreet)
71
    {
72 10
        if (preg_match($regexLine['regex'], $fullStreet, $matches)) {
73 10
            return $this->getMatchResult($matches, $regexLine);
74
        }
75
76 10
        return ['score' => -1];
77
    }
78
79
    /**
80
     * @param array $matches
81
     * @param array $regexLine
82
     *
83
     * @return array
84
     */
85 10
    private function getMatchResult(array $matches, array $regexLine)
86
    {
87 10
        $result = [];
88 10
        $score  = 0;
89
90 10
        foreach (['street', 'number', 'box'] as $streetItem) {
91 10
            if (isset($matches[$regexLine[$streetItem]])) {
92 10
                $score++;
93 10
                $result[$streetItem] = $matches[$regexLine[$streetItem]];
94
            } else {
95 10
                $result[$streetItem] = '';
96
            }
97
        }
98
99 10
        $result['score'] = $score;
100
101 10
        return $result;
102
    }
103
}
104