16.3 File_SearchReplace 

Besprochene Version: 1.0.1 | Lizenz: BSD |
Klassendatei(en): File/SearchReplace.php |
File_SearchReplace gibt Ihnen, wie der Name schon vermuten lässt, die Möglichkeit, Dateien zu durchsuchen und bestimmte Wörter bzw. Suchmuster, die dort auftauchen, durch andere zu ersetzen. Zwar gestaltet sich die Nutzung auch hier recht einfach, aber eine kleine Einschränkung gibt es schon. Und zwar müssen Sie dem Paket die Namen der Dateien mitteilen, die durchsucht werden sollen. Möchten Sie also beispielsweise alle PHP-Dateien durchsuchen, stellt File_Find eine wirklich gute Hilfe dar.
Im einfachsten Fall übergeben Sie alle notwendigen Informationen direkt an den Konstruktor:
<?php include 'File/SearchReplace.php' ; // String, der gesucht werden soll $search = "Ja"; // String der die Ersetzung enthaelt $replace = "Nein"; // Dateien, die durchsucht werden sollen $files = array ('datei1.php', 'datei2.php' ); // Verzeichnisse, die durchsucht werden sollen $directory=array('/home/paul/public_html/' /home/gerd/public_html/'); // Sollen Unterverzeichnisse durchsucht werden? $subdir=true; // Zeilenanfaenge, die ignoriert werden sollen $ignore = array('#', '//') ; // Objekt instanziieren $snr = new File_SearchReplace( $search, $replace, $files, $directory, $subdir,$ignore) ; // Suche ausfuehren $snr -> doSearch(); // Auf Fehler ueberpruefen if (''!=$snr->getLastError()) { die ($snr->getLastError()); } ?>
Listing 16.5 Suchen und Ersetzen in Dateien
Der Konstruktor bekommt den zu suchenden Text und den Text, durch den der zu suchende Text ersetzt werden soll. Danach folgen die Dateinamen und die Verzeichnisse, die jeweils als Array übergeben werden. Bei den Verzeichnissen ist es wichtig, dass sie immer mit einem Slash (/) bzw. Backslash (\), je nach Betriebssystem, abgeschlossen werden, da das Paket sonst eine recht stattliche Anzahl von Warnungen produzieren kann. Die letzten beiden Parameter definieren, ob Unterverzeichnisse mit durchsucht werden sollen (was durch einen booleschen Wert zu definieren ist) und ob bestimmte Zeilen ignoriert werden sollen. Zeilen, die beim Ersetzungsvorgang ignoriert werden sollen, erkennt das Paket am Zeilenanfang. Die Zeilenanfänge, die ignoriert werden sollen, werden einfach in Form eines Arrays übergeben.
Im obigen Beispiel wird also in den Unterverzeichnissen /home/paul/public_html/ und /home/gerd/public_html/ nach den Dateien datei1.php und datei2.php gesucht, in denen jeweils jedes Auftreten von Ja durch Nein ersetzt wird. Dabei werden alle Zeilen ignoriert, die mit # oder // beginnen.
Die Methode doSearch() führt dann den eigentlichen Ersetzungsvorgang durch. In File_Find ist eine eigene Fehlerbehandlung implementiert, so dass Sie nicht auf die von PEAR zurückgreifen können. Die Methode getLastError() liefert Ihnen entweder die letzte Fehlermeldung oder einen leeren String, so dass auf dieser Basis ein Fehler diagnostiziert werden kann.
Das Paket unterstützt aber auch die Möglichkeit, mit regulären Ausdrücken zu arbeiten. Hierzu können Sie mithilfe der Methode setSearchFunction() definieren, welche PHP-Funktion zum Suchen und Ersetzen genutzt werden soll. Mit dem Parameter 'quick' greift das Paket auf str_replace() zurück. Der Parameter 'preg' definiert die Nutzung von Perl-kompatiblen regulären Ausdrücken, wohingegen 'ereg' die Unterstützung der PHP- bzw. POSIX-Variante einschaltet. Wenn Sie eine dieser Varianten nutzen, ist es allerdings nicht möglich, Zeilen mithilfe eines Kommentarzeichens von der Konvertierung auszunehmen.