Passed
Push — upstream-8.11.0 ( 4431ea )
by Joshua
03:25
created

Matcher::lookingAt()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 0
dl 0
loc 3
ccs 2
cts 2
cp 1
crap 1
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 3410
    public function __construct($pattern, $subject)
38
    {
39 3410
        $this->pattern = str_replace('/', '\/', $pattern);
40 3410
        $this->subject = $subject;
41 3410
    }
42
43 3410
    protected function doMatch($type = 'find', $offset = 0)
44
    {
45 3410
        $final_pattern = '(?:' . $this->pattern . ')';
46
        switch ($type) {
47 3410
            case 'matches':
48 3378
                $final_pattern = '^' . $final_pattern . '$';
49 3378
                break;
50 3402
            case 'lookingAt':
51 3376
                $final_pattern = '^' . $final_pattern;
52 3376
                break;
53 3344
            case 'find':
54 3344
            default:
55
                // no changes
56 3344
                break;
57
        }
58 3410
        $final_pattern = '/' . $final_pattern . '/ui';
59
60 3410
        $search = mb_substr($this->subject, $offset);
61
62 3410
        $result = preg_match($final_pattern, $search, $groups, PREG_OFFSET_CAPTURE);
63
64 3410
        if ($result === 1) {
65
            // Expand $groups into $this->groups, but being multi-byte aware
66
67 2971
            $positions = array();
68
69 2971
            foreach ($groups as $group) {
70 2971
                $positions[] = array(
71 2971
                    $group[0],
72 2971
                    $offset + mb_strlen(mb_strcut($search, 0, $group[1]))
73 2971
                );
74 2971
            }
75
76 2971
            $this->groups = $positions;
77 2971
        }
78
79 3410
        return ($result === 1);
80
    }
81
82
    /**
83
     * @return bool
84
     */
85 3378
    public function matches()
86
    {
87 3378
        return $this->doMatch('matches');
88
    }
89
90
    /**
91
     * @return bool
92
     */
93 3376
    public function lookingAt()
94
    {
95 3376
        return $this->doMatch('lookingAt');
96
    }
97
98
    /**
99
     * @return bool
100
     */
101 3344
    public function find($offset = null)
102
    {
103 3344
        if ($offset === null) {
104 3343
            $offset = $this->searchIndex;
105 3343
        }
106
107
        // Increment search index for the next time we call this
108 3344
        $this->searchIndex++;
109 3344
        return $this->doMatch('find', $offset);
110
    }
111
112
    /**
113
     * @return int
114
     */
115 169
    public function groupCount()
116
    {
117 169
        if (empty($this->groups)) {
118
            return null;
119
        }
120
121 169
        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 31
        }
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 337
    public function end($group = null)
141
    {
142 337
        if ($group === null) {
143 337
            $group = 0;
144 337
        }
145 337
        if (!isset($this->groups[$group])) {
146
            return null;
147
        }
148 337
        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 233
        }
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