Biểu thức chính quy
$directory = new RecursiveDirectoryIterator(__DIR__);
$flattened = new RecursiveIteratorIterator($directory);
// Đảm bảo path không chứa "/.Trash*" và kết thúc bằng .php hoặc .html
$files = new RegexIterator($flattened, '#^(?:[A-Z]:)?(?:/(?!\.Trash)[^/]+)+/[^/]+\.(?:php|html)$#Di');
foreach($files as $file) {
echo $file . PHP_EOL;
}
Sử dụng bộ lọc
Lớp cơ sở giữ regex dùng với bộ lọc.
Các class kế thừa. RecursiveRegexIterator được kế thừa.
abstract class FilesystemRegexFilter extends RecursiveRegexIterator {
protected $regex;
public function __construct(RecursiveIterator $it, $regex) {
$this->regex = $regex;
parent::__construct($it, $regex);
}
}
Chúng là bộ lọc cơ bản làm việc với tên file và thư mục tương ứng.
class FilenameFilter extends FilesystemRegexFilter {
// Lọc file với regex
public function accept() {
return ( ! $this->isFile() || preg_match($this->regex, $this->getFilename()));
}
}
class DirnameFilter extends FilesystemRegexFilter {
// Lọc thư mục với regex
public function accept() {
return ( ! $this->isDir() || preg_match($this->regex, $this->getFilename()));
}
}
Mã dưới duyệt đệ quy nội dung thư mục. Lọc thư mục trash và chỉ giữ file PHP/HTML.
$directory = new RecursiveDirectoryIterator(__DIR__);
// Lọc thư mục ".Trash*"
$filter = new DirnameFilter($directory, '/^(?!\.Trash)/');
// Lọc file PHP/HTML
$filter = new FilenameFilter($filter, '/\.(?:php|html)$/');
foreach(new RecursiveIteratorIterator($filter) as $file) {
echo $file . PHP_EOL;
}
Quét sâu đến level 2 dùng mã trên
$files = new RecursiveIteratorIterator($filter);
$files->setMaxDepth(1); // Hai level, tham số zero-based.
foreach($files as $file) {
echo $file . PHP_EOL;
}