Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> PHP

Cách dùng RegexIterator trong PHP


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