How to use RegexIterator in PHP?

RegexIterator is a built-in PHP class that filters iterators using regular expressions. It's particularly useful for filtering file listings, array elements, or any iterable data based on pattern matching.

Basic File Filtering

The most common use case is filtering files in a directory based on their names or paths ?

<?php
$directory = new RecursiveDirectoryIterator(__DIR__);
$flattened = new RecursiveIteratorIterator($directory);

// Filter paths that don't contain ".Trash*" folders and end with .php or .html
$files = new RegexIterator($flattened, '#^(?:[A-Z]:)?(?:/(?!\.Trash)[^/]+)+/[^/]+\.(?:php|html)$#Di');
foreach($files as $file) {
    echo $file . PHP_EOL;
}
?>

Creating Custom Filter Classes

For more complex filtering scenarios, you can extend RegexIterator to create reusable filter classes ?

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

Combining Multiple Filters

You can chain multiple filters to apply complex filtering logic ?

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

Limiting Directory Depth

You can control how deep the iterator searches in nested directories ?

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

Simple Array Filtering

RegexIterator also works with arrays and other iterables ?

<?php
$emails = ['user@example.com', 'invalid-email', 'admin@site.org'];
$iterator = new ArrayIterator($emails);
$validEmails = new RegexIterator($iterator, '/^[^@]+@[^@]+\.[^@]+$/');

foreach($validEmails as $email) {
    echo "Valid email: $email<br>";
}
?>

Conclusion

RegexIterator provides powerful pattern-based filtering for iterators in PHP. Use it for file system operations, data validation, or any scenario where you need to filter collections using regular expressions.

Updated on: 2026-03-15T08:39:03+05:30

379 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements