Hoa central
RegularExpression.php
Go to the documentation of this file.
1 <?php
2 
37 namespace Hoa\Iterator;
38 
52 {
58  const USE_KEY = 1;
59 
65  const INVERT_MATCH = 2;
66 
72  const MATCH = 0;
73 
79  const GET_MATCH = 1;
80 
86  const ALL_MATCHES = 2;
87 
93  const SPLIT = 3;
94 
100  const REPLACE = 4;
101 
107  protected $_regex = null;
108 
115  protected $_mode = 0;
116 
123  protected $_flags = 0;
124 
130  protected $_pregFlags = 0;
131 
137  protected $_key = 0;
138 
144  protected $_current = null;
145 
151  public $replacement = null;
152 
153 
154 
171  public function __construct(
172  \Iterator $iterator,
173  $regex,
174  $mode = self::MATCH,
175  $flags = 0,
176  $pregFlags = 0
177  ) {
178  parent::__construct($iterator);
179 
180  $this->_regex = $regex;
181  $this->setMode($mode);
182  $this->setFlags($flags);
183  $this->setPregFlags($pregFlags);
184  $this->replacement = null;
185 
186  return;
187  }
188 
194  public function accept()
195  {
196  if (is_array(parent::current())) {
197  return false;
198  }
199 
200  $this->_key = parent::key();
201  $this->_current = parent::current();
202 
203  $matches = [];
204  $useKey = $this->_flags & self::USE_KEY;
205  $subject = $useKey ? $this->_key : $this->_current;
206  $out = false;
207 
208  switch ($this->_mode) {
209 
210  case self::MATCH:
211  $out = 0 !== preg_match(
212  $this->_regex,
213  $subject,
214  $matches,
215  $this->_pregFlags
216  );
217 
218  break;
219 
220  case self::GET_MATCH:
221  $this->_current = [];
222  $out = 0 !== preg_match(
223  $this->_regex,
224  $subject,
225  $this->_current,
226  $this->_pregFlags
227  );
228 
229  break;
230 
231  case self::ALL_MATCHES:
232  $this->_current = [];
233  $out = 0 < preg_match_all(
234  $this->_regex,
235  $subject,
236  $this->_current,
237  $this->_pregFlags
238  );
239 
240  break;
241 
242  case self::SPLIT:
243  $this->_current = preg_split(
244  $this->_regex,
245  $subject,
246  null,
247  $this->_pregFlags
248  );
249 
250  $out =
251  is_array($this->_current) &&
252  1 < count($this->_current);
253 
254  break;
255 
256  case self::REPLACE:
257  $numberOfReplacement = 0;
258  $result = preg_replace(
259  $this->_regex,
260  $this->replacement,
261  $subject,
262  -1,
263  $numberOfReplacement
264  );
265 
266  if (null === $result || 0 === $numberOfReplacement) {
267  $out = false;
268 
269  break;
270  }
271 
272  if (0 !== $useKey) {
273  $this->_key = $result;
274  $out = true;
275 
276  break;
277  }
278 
279  $this->_current = $result;
280  $out = true;
281 
282  break;
283 
284  default:
285  $out = false;
286 
287  break;
288  }
289 
290  if (0 !== ($this->_flags & self::INVERT_MATCH)) {
291  return false === $out;
292  }
293 
294  return $out;
295  }
296 
302  public function key()
303  {
304  return $this->_key;
305  }
306 
312  public function current()
313  {
314  return $this->_current;
315  }
316 
323  public function setMode($mode)
324  {
325  if ($mode < self::MATCH || $mode > self::REPLACE) {
326  throw new \InvalidArgumentException(
327  'Illegal mode ' . $mode . '.'
328  );
329  }
330 
331  $this->_mode = $mode;
332 
333  return;
334  }
335 
342  public function setFlags($flags)
343  {
344  $this->_flags = $flags;
345 
346  return;
347  }
348 
355  public function setPregFlags($pregFlags)
356  {
357  $this->_pregFlags = $pregFlags;
358 
359  return;
360  }
361 
367  public function getRegex()
368  {
369  return $this->_regex;
370  }
371 
377  public function getMode()
378  {
379  return $this->_mode;
380  }
381 
387  public function getFlags()
388  {
389  return $this->_flags;
390  }
391 
397  public function getPregFlags()
398  {
399  return $this->_pregFlags;
400  }
401 }
__construct(\Iterator $iterator, $regex, $mode=self::MATCH, $flags=0, $pregFlags=0)