Checks if the types of returned expressions are compatible with the documented types.
1 | <?php |
||
2 | |||
3 | namespace Jasny\Twig; |
||
4 | |||
5 | use Twig\Error\RuntimeError; |
||
6 | use Twig\Extension\AbstractExtension; |
||
7 | use Twig\TwigFilter; |
||
8 | |||
9 | /** |
||
10 | * Expose the PCRE functions to Twig. |
||
11 | * |
||
12 | * @see http://php.net/manual/en/book.pcre.php |
||
13 | */ |
||
14 | class PcreExtension extends AbstractExtension |
||
15 | { |
||
16 | /** |
||
17 | * Class constructor |
||
18 | */ |
||
19 | 27 | public function __construct() |
|
20 | { |
||
21 | 27 | if (!extension_loaded('pcre')) { |
|
22 | throw new \Exception("The Twig PCRE extension requires the PCRE extension."); // @codeCoverageIgnore |
||
23 | } |
||
24 | 27 | } |
|
25 | |||
26 | /** |
||
27 | * Return extension name |
||
28 | * |
||
29 | * @return string |
||
30 | */ |
||
31 | 1 | public function getName() |
|
32 | { |
||
33 | 1 | return 'jasny/pcre'; |
|
34 | } |
||
35 | |||
36 | /** |
||
37 | * {@inheritdoc} |
||
38 | */ |
||
39 | 26 | public function getFilters() |
|
40 | { |
||
41 | return [ |
||
42 | 26 | new TwigFilter('preg_quote', [$this, 'quote']), |
|
43 | 26 | new TwigFilter('preg_match', [$this, 'match']), |
|
44 | 26 | new TwigFilter('preg_get', [$this, 'get']), |
|
45 | 26 | new TwigFilter('preg_get_all', [$this, 'getAll']), |
|
46 | 26 | new TwigFilter('preg_grep', [$this, 'grep']), |
|
47 | 26 | new TwigFilter('preg_replace', [$this, 'replace']), |
|
48 | 26 | new TwigFilter('preg_filter', [$this, 'filter']), |
|
49 | 26 | new TwigFilter('preg_split', [$this, 'split']), |
|
50 | ]; |
||
51 | } |
||
52 | |||
53 | |||
54 | /** |
||
55 | * Check that the regex doesn't use the eval modifier |
||
56 | * |
||
57 | * @param string $pattern |
||
58 | * @throws \LogicException |
||
59 | */ |
||
60 | 8 | protected function assertNoEval($pattern) |
|
61 | { |
||
62 | 8 | $pos = strrpos($pattern, $pattern[0]); |
|
63 | 8 | $modifiers = substr($pattern, $pos + 1); |
|
64 | |||
65 | 8 | if (strpos($modifiers, 'e') !== false) { |
|
66 | 2 | throw new RuntimeError("Using the eval modifier for regular expressions is not allowed"); |
|
67 | } |
||
68 | 6 | } |
|
69 | |||
70 | |||
71 | /** |
||
72 | * Quote regular expression characters. |
||
73 | * |
||
74 | * @param string $value |
||
75 | * @param string $delimiter |
||
76 | * @return string |
||
77 | */ |
||
78 | 3 | public function quote($value, $delimiter = '/') |
|
79 | { |
||
80 | 3 | if (!isset($value)) { |
|
81 | 1 | return null; |
|
82 | } |
||
83 | |||
84 | 2 | return preg_quote($value, $delimiter); |
|
85 | } |
||
86 | |||
87 | /** |
||
88 | * Perform a regular expression match. |
||
89 | * |
||
90 | * @param string $value |
||
91 | * @param string $pattern |
||
92 | * @return boolean |
||
93 | */ |
||
94 | 4 | public function match($value, $pattern) |
|
95 | { |
||
96 | 4 | if (!isset($value)) { |
|
97 | 1 | return null; |
|
98 | } |
||
99 | |||
100 | 3 | return preg_match($pattern, $value); |
|
101 | } |
||
102 | |||
103 | /** |
||
104 | * Perform a regular expression match and return a matched group. |
||
105 | * |
||
106 | * @param string $value |
||
107 | * @param string $pattern |
||
108 | * @return string |
||
109 | */ |
||
110 | 3 | public function get($value, $pattern, $group = 0) |
|
111 | { |
||
112 | 3 | if (!isset($value)) { |
|
113 | 1 | return null; |
|
114 | } |
||
115 | |||
116 | 2 | return preg_match($pattern, $value, $matches) && isset($matches[$group]) ? $matches[$group] : null; |
|
117 | } |
||
118 | |||
119 | /** |
||
120 | * Perform a regular expression match and return the group for all matches. |
||
121 | * |
||
122 | * @param string $value |
||
123 | * @param string $pattern |
||
124 | * @return array |
||
125 | */ |
||
126 | 3 | public function getAll($value, $pattern, $group = 0) |
|
127 | { |
||
128 | 3 | if (!isset($value)) { |
|
129 | 1 | return null; |
|
130 | } |
||
131 | |||
132 | 2 | return preg_match_all($pattern, $value, $matches, PREG_PATTERN_ORDER) && isset($matches[$group]) |
|
133 | 2 | ? $matches[$group] : []; |
|
134 | } |
||
135 | |||
136 | /** |
||
137 | * Perform a regular expression match and return an array of entries that match the pattern |
||
138 | * |
||
139 | * @param array $values |
||
140 | * @param string $pattern |
||
141 | * @param string $flags Optional 'invert' to return entries that do not match the given pattern. |
||
142 | * @return array |
||
143 | */ |
||
144 | 3 | public function grep($values, $pattern, $flags = '') |
|
145 | { |
||
146 | 3 | if (!isset($values)) { |
|
147 | 1 | return null; |
|
148 | } |
||
149 | |||
150 | 2 | if (is_string($flags)) { |
|
151 | 2 | $flags = $flags === 'invert' ? PREG_GREP_INVERT : 0; |
|
152 | } |
||
153 | |||
154 | 2 | return preg_grep($pattern, $values, $flags); |
|
155 | } |
||
156 | |||
157 | /** |
||
158 | * Perform a regular expression search and replace. |
||
159 | * |
||
160 | * @param string $value |
||
161 | * @param string $pattern |
||
162 | * @param string $replacement |
||
163 | * @param int $limit |
||
164 | * @return string |
||
165 | */ |
||
166 | 5 | public function replace($value, $pattern, $replacement = '', $limit = -1) |
|
167 | { |
||
168 | 5 | $this->assertNoEval($pattern); |
|
169 | |||
170 | 4 | if (!isset($value)) { |
|
171 | 1 | return null; |
|
172 | } |
||
173 | |||
174 | 3 | return preg_replace($pattern, $replacement, $value, $limit); |
|
175 | } |
||
176 | |||
177 | /** |
||
178 | * Perform a regular expression search and replace, returning only matched subjects. |
||
179 | * |
||
180 | * @param string $value |
||
181 | * @param string $pattern |
||
182 | * @param string $replacement |
||
183 | * @param int $limit |
||
184 | * @return string |
||
185 | */ |
||
186 | 3 | public function filter($value, $pattern, $replacement = '', $limit = -1) |
|
187 | { |
||
188 | 3 | $this->assertNoEval($pattern); |
|
189 | |||
190 | 2 | if (!isset($value)) { |
|
191 | 1 | return null; |
|
192 | } |
||
193 | |||
194 | 1 | return preg_filter($pattern, $replacement, $value, $limit); |
|
195 | } |
||
196 | |||
197 | /** |
||
198 | * Split text into an array using a regular expression. |
||
199 | * |
||
200 | * @param string $value |
||
201 | * @param string $pattern |
||
202 | * @return array |
||
203 | */ |
||
204 | 2 | public function split($value, $pattern) |
|
205 | { |
||
206 | 2 | if (!isset($value)) { |
|
207 | 1 | return null; |
|
208 | } |
||
209 | |||
210 | 1 | return preg_split($pattern, $value); |
|
0 ignored issues
–
show
|
|||
211 | } |
||
212 | } |
||
213 |
If the returned type also contains false, it is an indicator that maybe an error condition leading to the specific return statement remains unhandled.