如何在 PHP 中使用 RegexIterator?


正则表达式

$directory = new RecursiveDirectoryIterator(__DIR__);
$flattened = new RecursiveIteratorIterator($directory);

// Make sure the path does not contain "/.Trash*" folders and ends eith a .php or .html file
$files = new RegexIterator($flattened, '#^(?:[A-Z]:)?(?:/(?!\.Trash)[^/]+)+/[^/]+\.(?:php|html)$#Di');
foreach($files as $file) {
   echo $file . PHP_EOL;
}

使用过滤器

基类持有需要同过滤器一起使用的正则表达式。

将对该类进行扩展的类。递归 RegexIterator 扩展了它。

abstract class FilesystemRegexFilter extends RecursiveRegexIterator {
   protected $regex;
   public function __construct(RecursiveIterator $it, $regex) {
      $this->regex = $regex;
      parent::__construct($it, $regex);
   }
}

它们是基本过滤器,分别与文件名和目录名进行匹配。

class FilenameFilter extends FilesystemRegexFilter {
   // Filter files with the help of regex
   public function accept() {
      return ( ! $this->isFile() || preg_match($this->regex, $this->getFilename()));
   }
}
class DirnameFilter extends FilesystemRegexFilter {
   // Filter directories with the help of regex
   public function accept() {
      return ( ! $this->isDir() || preg_match($this->regex, $this->getFilename()));
   }
}

下面的代码递归遍历目录内容。它会过滤掉垃圾文件夹,只保留 PHP 和 HTML 文件。

$directory = new RecursiveDirectoryIterator(__DIR__);

// Filter out ".Trash*" folders
$filter = new DirnameFilter($directory, '/^(?!\.Trash)/');

// Filter PHP/HTML files
$filter = new FilenameFilter($filter, '/\.(?:php|html)$/');

foreach(new RecursiveIteratorIterator($filter) as $file) {
   echo $file . PHP_EOL;
}

使用上述代码扫描深达 2 级的文件

$files = new RecursiveIteratorIterator($filter);
$files->setMaxDepth(1); // Two levels, the parameter is zero-based.
foreach($files as $file) {
   echo $file . PHP_EOL;
}

更新于: 07-04-2020

249 次浏览

开启你的 职业

通过完成课程获得认证

开始
广告
© . All rights reserved.