<?php
|
|
/*
|
* This file is part of the Symfony package.
|
*
|
* (c) Fabien Potencier <fabien@symfony.com>
|
*
|
* For the full copyright and license information, please view the LICENSE
|
* file that was distributed with this source code.
|
*/
|
|
namespace Symfony\Component\Finder\Iterator;
|
|
/**
|
* MultiplePcreFilterIterator filters files using patterns (regexps, globs or strings).
|
*
|
* @author Fabien Potencier <fabien@symfony.com>
|
*/
|
abstract class MultiplePcreFilterIterator extends \FilterIterator
|
{
|
protected $matchRegexps = [];
|
protected $noMatchRegexps = [];
|
|
/**
|
* @param \Iterator $iterator The Iterator to filter
|
* @param array $matchPatterns An array of patterns that need to match
|
* @param array $noMatchPatterns An array of patterns that need to not match
|
*/
|
public function __construct(\Iterator $iterator, array $matchPatterns, array $noMatchPatterns)
|
{
|
foreach ($matchPatterns as $pattern) {
|
$this->matchRegexps[] = $this->toRegex($pattern);
|
}
|
|
foreach ($noMatchPatterns as $pattern) {
|
$this->noMatchRegexps[] = $this->toRegex($pattern);
|
}
|
|
parent::__construct($iterator);
|
}
|
|
/**
|
* Checks whether the string is accepted by the regex filters.
|
*
|
* If there is no regexps defined in the class, this method will accept the string.
|
* Such case can be handled by child classes before calling the method if they want to
|
* apply a different behavior.
|
*
|
* @param string $string The string to be matched against filters
|
*
|
* @return bool
|
*/
|
protected function isAccepted($string)
|
{
|
// should at least not match one rule to exclude
|
foreach ($this->noMatchRegexps as $regex) {
|
if (preg_match($regex, $string)) {
|
return false;
|
}
|
}
|
|
// should at least match one rule
|
if ($this->matchRegexps) {
|
foreach ($this->matchRegexps as $regex) {
|
if (preg_match($regex, $string)) {
|
return true;
|
}
|
}
|
|
return false;
|
}
|
|
// If there is no match rules, the file is accepted
|
return true;
|
}
|
|
/**
|
* Checks whether the string is a regex.
|
*
|
* @param string $str
|
*
|
* @return bool Whether the given string is a regex
|
*/
|
protected function isRegex($str)
|
{
|
if (preg_match('/^(.{3,}?)[imsxuADU]*$/', $str, $m)) {
|
$start = substr($m[1], 0, 1);
|
$end = substr($m[1], -1);
|
|
if ($start === $end) {
|
return !preg_match('/[*?[:alnum:] \\\\]/', $start);
|
}
|
|
foreach ([['{', '}'], ['(', ')'], ['[', ']'], ['<', '>']] as $delimiters) {
|
if ($start === $delimiters[0] && $end === $delimiters[1]) {
|
return true;
|
}
|
}
|
}
|
|
return false;
|
}
|
|
/**
|
* Converts string into regexp.
|
*
|
* @param string $str Pattern
|
*
|
* @return string regexp corresponding to a given string
|
*/
|
abstract protected function toRegex($str);
|
}
|