Passed
Push — upstream-8.12.18 ( 255cf4 )
by Joshua
13:29
created

Matcher::find()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 9
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 2

Importance

Changes 0
Metric Value
cc 2
eloc 4
nc 2
nop 1
dl 0
loc 9
ccs 5
cts 5
cp 1
crap 2
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace libphonenumber;
4
5
/**
6
 * Matcher for various regex matching
7
 *
8
 * Note that this is NOT the same as google's java PhoneNumberMatcher class.
9
 * This class is a minimal port of java's built-in matcher class, whereas PhoneNumberMatcher
10
 * is designed to recognize phone numbers embedded in any text.
11
 *
12
 * @internal
13
 */
14
class Matcher
15
{
16
    /**
17
     * @var string
18
     */
19
    protected $pattern;
20
21
    /**
22
     * @var string
23
     */
24
    protected $subject;
25
26
    /**
27
     * @var array
28
     */
29
    protected $groups = array();
30
31
    private $searchIndex = 0;
32
33
    /**
34
     * @param string $pattern
35
     * @param string $subject
36
     */
37 3428
    public function __construct($pattern, $subject)
38
    {
39 3428
        $this->pattern = str_replace('/', '\/', $pattern);
40 3428
        $this->subject = $subject;
41 3428
    }
42
43 3428
    protected function doMatch($type = 'find', $offset = 0)
44
    {
45 3428
        $final_pattern = '(?:' . $this->pattern . ')';
46 3428
        switch ($type) {
47 3428
            case 'matches':
48 3396
                $final_pattern = '^' . $final_pattern . '$';
49 3396
                break;
50 3420
            case 'lookingAt':
51 3394
                $final_pattern = '^' . $final_pattern;
52 3394
                break;
53 3362
            case 'find':
54
            default:
55
                // no changes
56 3362
                break;
57
        }
58 3428
        $final_pattern = '/' . $final_pattern . '/ui';
59
60 3428
        $search = mb_substr($this->subject, $offset);
61
62 3428
        $result = preg_match($final_pattern, $search, $groups, PREG_OFFSET_CAPTURE);
63
64 3428
        if ($result === 1) {
65
            // Expand $groups into $this->groups, but being multi-byte aware
66
67 2988
            $positions = array();
68
69 2988
            foreach ($groups as $group) {
70 2988
                $positions[] = array(
71 2988
                    $group[0],
72 2988
                    $offset + mb_strlen(substr($search, 0, $group[1]))
73
                );
74
            }
75
76 2988
            $this->groups = $positions;
77
        }
78
79 3428
        return ($result === 1);
80
    }
81
82
    /**
83
     * @return bool
84
     */
85 3396
    public function matches()
86
    {
87 3396
        return $this->doMatch('matches');
88
    }
89
90
    /**
91
     * @return bool
92
     */
93 3394
    public function lookingAt()
94
    {
95 3394
        return $this->doMatch('lookingAt');
96
    }
97
98
    /**
99
     * @return bool
100
     */
101 3362
    public function find($offset = null)
102
    {
103 3362
        if ($offset === null) {
104 3361
            $offset = $this->searchIndex;
105
        }
106
107
        // Increment search index for the next time we call this
108 3362
        $this->searchIndex++;
109 3362
        return $this->doMatch('find', $offset);
110
    }
111
112
    /**
113
     * @return int
114
     */
115 173
    public function groupCount()
116
    {
117 173
        if (empty($this->groups)) {
118
            return null;
119
        }
120
121 173
        return count($this->groups) - 1;
122
    }
123
124
    /**
125
     * @param int $group
126
     * @return string
127
     */
128 103
    public function group($group = null)
129
    {
130 103
        if ($group === null) {
131 31
            $group = 0;
132
        }
133 103
        return isset($this->groups[$group][0]) ? $this->groups[$group][0] : null;
134
    }
135
136
    /**
137
     * @param int|null $group
138
     * @return int
139
     */
140 341
    public function end($group = null)
141
    {
142 341
        if ($group === null) {
143 341
            $group = 0;
144
        }
145 341
        if (!isset($this->groups[$group])) {
146
            return null;
147
        }
148 341
        return $this->groups[$group][1] + mb_strlen($this->groups[$group][0]);
149
    }
150
151 233
    public function start($group = null)
152
    {
153 233
        if ($group === null) {
154 233
            $group = 0;
155
        }
156 233
        if (!isset($this->groups[$group])) {
157
            return null;
158
        }
159
160 233
        return $this->groups[$group][1];
161
    }
162
163
    /**
164
     * @param string $replacement
165
     * @return string
166
     */
167 60
    public function replaceFirst($replacement)
168
    {
169 60
        return preg_replace('/' . $this->pattern . '/x', $replacement, $this->subject, 1);
170
    }
171
172
    /**
173
     * @param string $replacement
174
     * @return string
175
     */
176 121
    public function replaceAll($replacement)
177
    {
178 121
        return preg_replace('/' . $this->pattern . '/x', $replacement, $this->subject);
179
    }
180
181
    /**
182
     * @param string $input
183
     * @return Matcher
184
     */
185 59
    public function reset($input = '')
186
    {
187 59
        $this->subject = $input;
188
189 59
        return $this;
190
    }
191
}
192