Start · Sprachen · PHP · Referenz · RecursiveRegexIterator

RecursiveRegexIterator

Klasse

Filtert einen rekursiven Iterator anhand eines regulären Ausdrucks und erlaubt das rekursive Durchlaufen von Verzeichnis- oder Baumstrukturen.

seit PHP 5.2.0 Kategorie: oop

Signatur

class RecursiveRegexIterator extends RegexIterator implements RecursiveIterator

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

Typ

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;
}
/var/www/html/index.php /var/www/html/src/Controller.php /var/www/html/src/Model/User.php ...

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;
}
0: apple 1: apricot 3: avocado 0: artichoke 2: asparagus

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;
}
Element 0 enthält Zahl: 123 Element 1 enthält Zahl: 456 Element 2 enthält Zahl: 789

// 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.