Computer >> Máy Tính >  >> Lập trình >> PHP

Làm thế nào để sử dụng RegexIterator trong PHP?

Biểu thức chính quy

$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;
}

Sử dụng bộ lọc

Một lớp cơ sở chứa regex cần được sử dụng với bộ lọc.

các lớp sẽ mở rộng lớp này. RecursiveRegexIterator được mở rộng.

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

Chúng là các bộ lọc cơ bản và hoạt động với tên tệp và thư mục tương ứng.

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()));
   }
}

Đoạn mã dưới đây lặp lại đệ quy qua nội dung thư mục. Các thư mục thùng rác được lọc ra và chỉ các tệp PHP và HTML được giữ lại.

$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;
}

Quét sâu tới 2 cấp bằng mã trên

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