如何在 PHP 中使用 RegexIterator?
phpserver side programmingprogramming更新于 2025/6/28 0:22:17
正则表达式
$directory = new RecursiveDirectoryIterator(__DIR__);
$flattened = new RecursiveIteratorIterator($directory);
// 确保路径不包含"/.Trash*"文件夹,并且以 .php 或 .html 文件结尾
$files = new RegexIterator($flattened, '#^(?:[A-Z]:)?(?:/(?!\.Trash)[^/]+)+/[^/]+\.(?:php|html)$#Di');
foreach($files as $file) {
echo $file . PHP_EOL;
}
使用过滤器
基类包含需要与过滤器一起使用的正则表达式。
将扩展此基类的类。RecursiveRegexIterator 已扩展。
abstract class FilesystemRegexFilter extends RecursiveRegexIterator {
protected $regex;
public function __construct(RecursiveIterator $it, $regex) {
$this->regex = $regex;
parent::__construct($it, $regex);
}
}
它们是基本过滤器,分别用于处理文件和目录名称。
class FilenameFilter extends FilesystemRegexFilter {
// 使用正则表达式过滤文件
public function accept() {
return ( ! $this->isFile() || preg_match($this->regex, $this->getFilename()));
}
}
class DirnameFilter extends FilesystemRegexFilter {
// 使用正则表达式过滤目录
public function accept() {
return ( ! $this->isDir() || preg_match($this->regex, $this->getFilename()));
}
}
以下代码对目录内容进行递归迭代。垃圾文件夹会被过滤掉,只保留 PHP 和 HTML 文件。
$directory = new RecursiveDirectoryIterator(__DIR__);
// 过滤掉".Trash*"文件夹
$filter = new DirnameFilter($directory, '/^(?!\.Trash)/');
// 过滤 PHP/HTML 文件
$filter = new FilenameFilter($filter, '/\.(?:php|html)$/');
foreach(new RecursiveIteratorIterator($filter) as $file) {
echo $file . PHP_EOL;
}
使用上述代码扫描最多 2 层深度
$files = new RecursiveIteratorIterator($filter);
$files->setMaxDepth(1); // 两层深度,参数从零开始。
foreach($files as $file) {
echo $file . PHP_EOL;
}

