【发布时间】:2018-02-02 02:25:46
【问题描述】:
我只是尝试循环遍历目录中的所有文件,递归地过滤到仅与模式匹配的文件。
原来RegexIterator 给了你正则表达式匹配对象,但我想要SplInfo 对象。
这就是我所拥有的:
class RegexFilterIterator extends RecursiveFilterIterator {
private $pattern;
public function __construct(RecursiveIterator $iterator, $pattern) {
parent::__construct($iterator);
$this->pattern = $pattern;
}
public function accept() {
return preg_match($this->pattern, $this->current()->getFilename()) > 0;
}
}
$dir = new RecursiveDirectoryIterator($argv[1]);
$regex = new RegexFilterIterator($dir, '/\.php5?\z/i');
$it = new RecursiveIteratorIterator($regex);
foreach($it as $foo) {
echo $foo->getPathname().PHP_EOL;
}
但这似乎不是递归的。
我相信这是因为 \RegexFilterIterator::accept 实际上也被提供了目录,我拒绝它们,因为它们不以 .php 结尾。
很容易解决,对吧?稍微修改一下:
public function accept() {
return $this->current()->isDir() || preg_match($this->pattern, $this->current()->getFilename()) > 0;
}
现在它崩溃了:
PHP 致命错误:未捕获的 ArgumentCountError:函数 RegexFilterIterator::__construct() 的参数太少,通过了 1 个,而 bleep
中预期正好有 2 个
这对我来说没有任何意义。为什么要尝试自己构建更多 RegexFilterIterator 实例,它是如何搞砸的??
我会将RegexFilterIterator 放在 RecursiveIteratorIterator 之后,但它对我大喊大叫:
PHP 致命错误:未捕获的 TypeError:传递给 RegexFilterIterator::__construct() 的参数 1 必须实现接口 RecursiveIterator,给定 RecursiveIteratorIterator 的实例
所以...我不知道你应该如何使用这些类。
我如何递归目录中的所有文件,并使用简单的正则表达式过滤它们,给我一个生成 SplInfo 对象的生成器/可迭代对象?
【问题讨论】:
标签: php