Ich bastle gerade an einem Skript zum Zippen eines Verzeichnisses und nutze dazu die SPL-Klassen. Jetzt will ich aber nicht alle Dateien/Verzeichnisse aus einem Quellverzeichnis übernehmen, sondern Elemente die einem regulären Ausdruck entsprechend ignorieren. So frühstücke ich dann zum Beispiel die ".svn" oder "CVS"-Verzeichnisse ab.
Der reguläre Ausdruck hat zum Beispiel die Form:
Nun ist es nicht einfach möglich, einen regulären Ausdruck zu negieren, also bleibt nichts anderes übrig, als das Ergebnis des match-Vorganges zu negieren.
Das rekursive Verzeichnis parsen mache ich mit folgender Objektverschachtelung:
Um den Regex da noch direkt vor zu bekommen, schalte ich vor den RII noch eine RegexIterator-Instanz. Allerdings ist jetzt das Problem, dass der Regex ja genau auf die Elemente zutrifft, die ich ausschließen möchte.
Darum ist meine Lösung momentan, dass ich eine Unterklasse erstellt habe, die das Ergebnis der accept-Methode negiert zurückgibt.
Das funktioniert auch wunderbar. Und nun die eigentliche Frage: Geht die Negation des regulären Ausdrucks auch einfacher? Auf die SPL-Klassen will ich eigentlich nicht verzichten, sondern ich Ziele viel mehr darauf, ob nicht jemand eine Lösung kennt, bei der ich keine eigene Unterklassen erstellen muss. Irgendwelche Flags, die ich setzen kann? Oder eine andere Nutzung der Iteratoren? Wäre für jeden Ratschlag sehr dankbar.
Der reguläre Ausdruck hat zum Beispiel die Form:
Code:
~[/\\]\.svn|CVS[/\\]~i
Das rekursive Verzeichnis parsen mache ich mit folgender Objektverschachtelung:
PHP Code:
$iterator=
new RecursiveIteratorIterator(
new RecursiveDirectoryIterator(
$basepath.$package
),
RecursiveIteratorIterator::SELF_FIRST
);
Darum ist meine Lösung momentan, dass ich eine Unterklasse erstellt habe, die das Ergebnis der accept-Methode negiert zurückgibt.
PHP Code:
class NegateRegexIterator extends RegexIterator {
public function accept() {
return(!parent::accept());
}
}
Comment