Signatur
Beschreibung
RecursiveRegexIterator kombiniert die Filterfunktionalität von RegexIterator mit der Fähigkeit, rekursive Iteratoren zu verarbeiten. Er kann auf jeden Iterator angewendet werden, der das RecursiveIterator-Interface implementiert, zum Beispiel RecursiveDirectoryIterator oder RecursiveArrayIterator.
Der Iterator prüft bei jedem Schritt, ob das aktuelle Element dem angegebenen regulären Ausdruck entspricht. Elemente, die nicht dem Muster entsprechen, werden übersprungen. Dabei bleibt die rekursive Struktur erhalten: Unterverzeichnisse oder Kindknoten werden weiterhin angeboten, sofern sie selbst Kinder haben könnten.
Typischerweise wird RecursiveRegexIterator zusammen mit RecursiveIteratorIterator genutzt, um rekursiv durch eine gefilterte Baum- oder Verzeichnisstruktur zu iterieren. Die Filtermodi entsprechen denen von RegexIterator, also MATCH, GET_MATCH, ALL_MATCH, SPLIT und REPLACE.
Besonders nützlich ist die Klasse beim Durchsuchen verschachtelter Verzeichnisstrukturen nach Dateien, die einem bestimmten Muster entsprechen, ohne manuell rekursiv iterieren zu müssen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $iterator Pflicht | RecursiveIterator | Ein rekursiver Iterator, der gefiltert werden soll, z. B. ein RecursiveDirectoryIterator oder RecursiveArrayIterator. |
|
| $pattern Pflicht | string | Der reguläre Ausdruck (PCRE), anhand dessen die Elemente gefiltert werden, z. B. '/\.php$/i'. |
|
| $mode | int | RegexIterator::MATCH | Der Filtermodus. Mögliche Werte: RegexIterator::MATCH, RegexIterator::GET_MATCH, RegexIterator::ALL_MATCH, RegexIterator::SPLIT, RegexIterator::REPLACE. |
| $flags | int | 0 | Optionale Flags, die das Verhalten des Iterators steuern, z. B. RegexIterator::USE_KEY, um den Schlüssel statt des Wertes zu prüfen. |
| $pregFlags | int | 0 | PCRE-Flags, die an die interne preg_match()-Funktion weitergegeben werden, z. B. PREG_OFFSET_CAPTURE. |
Rückgabewert
Beispiele
PHP-Dateien in einem Verzeichnisbaum finden
<?php
$directory = new RecursiveDirectoryIterator(__DIR__);
$regexIterator = new RecursiveRegexIterator(
$directory,
'/\.php$/i'
);
$iterator = new RecursiveIteratorIterator($regexIterator);
foreach ($iterator as $file) {
echo $file->getPathname() . PHP_EOL;
}
Verschachteltes Array nach Muster filtern
<?php
$data = [
'fruits' => ['apple', 'apricot', 'banana', 'avocado'],
'veggies' => ['artichoke', 'broccoli', 'asparagus'],
];
$arrayIterator = new RecursiveArrayIterator($data);
$regexIterator = new RecursiveRegexIterator(
$arrayIterator,
'/^a/i'
);
$iterator = new RecursiveIteratorIterator($regexIterator);
foreach ($iterator as $key => $value) {
echo $key . ': ' . $value . PHP_EOL;
}
Nur übereinstimmende Teile zurückgeben (GET_MATCH-Modus)
<?php
$data = ['foo_123', 'bar_456', 'baz_789', 'qux'];
$arrayIterator = new RecursiveArrayIterator($data);
$regexIterator = new RecursiveRegexIterator(
$arrayIterator,
'/(\d+)/',
RegexIterator::GET_MATCH
);
foreach ($regexIterator as $key => $match) {
echo "Element $key enthält Zahl: " . $match[1] . PHP_EOL;
}
// Wichtig · Fallstricke
Wichtig: Obwohl RecursiveRegexIterator das RecursiveIterator-Interface implementiert, werden Unterknoten (Kinder) nicht automatisch gefiltert — sie werden immer dann angeboten, wenn der aktuelle Knoten Kinder hat, unabhängig vom Regex-Muster. Das eigentliche Filtern findet nur auf der Blattebene statt, sofern man ihn mit RecursiveIteratorIterator kombiniert.
Bei der Verwendung mit RecursiveDirectoryIterator sollte man RecursiveDirectoryIterator::SKIP_DOTS setzen, um . und .. zu überspringen, da diese andernfalls zu unerwarteten Ergebnissen führen können.
Die regulären Ausdrücke folgen der PCRE-Syntax. Ungültige Muster lösen eine E_WARNING aus, verursachen aber keinen Abbruch.