นิพจน์ปกติ
$directory = new RecursiveDirectoryIterator(__DIR__); $flattened = new RecursiveIteratorIterator($directory); // ให้แน่ใจว่า path ไม่มี "/.Trash*" โฟลเดอร์ และลงท้ายด้วย .php หรือ .html $files = new RegexIterator($flattened, '#^(?:[A-Z]:)?(?:/(?!\.Trash)[^/]+)+/[^/]+\.(?:php|html)$#Di'); foreach($files as $file) { echo $file . PHP_EOL; }ใช้ตัวกรอง
คลาสฐานเก็บ regex ที่ต้องใช้กับตัวกรอง
คลาสที่จะขยายคลาสนี้ 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 { // กรองไฟล์ด้วย regex public function accept() { return ( ! $this->isFile() || preg_match($this->regex, $this->getFilename())); } } class DirnameFilter extends FilesystemRegexFilter { // กรองไดเรกทอรีด้วย regex public function accept() { return ( ! $this->isDir() || preg_match($this->regex, $this->getFilename())); } }โค้ดด้านล่างวนลูปแบบ recursive ผ่านเนื้อหาไดเรกทอรี กรองโฟลเดอร์ trash ออก และเก็บเฉพาะไฟล์ 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); // สองระดับ พารามิเตอร์เป็น zero-based foreach($files as $file) { echo $file . PHP_EOL; }