Am Ende der Seite finden Sie das komplette Beispiel als Download.
Systemvoraussetzung
Datei(en)
searchShellFile.php
Problem
Sie möchten in Verzeichnissen bzw. in Dateien nach bestimmten Wörtern
oder Wortgruppen suchen? Diese Problemstellung gehört wohl zu einer der
schwersten Aufgaben in der Programmierung.
Es fängt alleine damit an, das Verzeichnis rekursiv zu durchlaufen, die Dateien
zu öffnen, nach den Suchwörtern zu suchen und letztendlich die Ausgabe
zu formatieren. Leider ist es aber manchmal doch nötig, solche Operationen
durchzuführen.
Wir werden Ihnen hier eine Lösung auf Shell-Basis
zeigen, mit der Sie ohne
Probleme eine Volltextsuche auf Ihrer Webseite programmieren.
Lösung
Bei der hier gezeigten Lösung greifen wir auf „grep“ zu, ein sehr mächtiges
Tool für Suchoperationen. Wir werden Ihnen hier einige Optionen und reguläre
Ausdrücke auflisten, sodass Sie später selbst die Suchmechanismen anpassen
können. Der Shell-Befehl
ist dabei folgendermaßen aufgebaut:
grep [OPTION]. . . PATTERN [FILE] . . . |
Anhand eines Beispiels sehen Sie, wie der Befehl mit Optionen und einer
rekursiven Verzeichnissuche aufgebaut sein könnte.
grep -cH
--directories=recurse 'Suchwörter' verzeichnis/ |
Wichtige Optionen
- -i,
--ignore-case
Groß- und
Kleinschreibung werden nicht unterschieden.
- -w,
--word-regexp
Das Suchmuster muss ein einzelnes Wort sein (also kein Bestandteil eines
anderen Wortes).
- - s,
--no-messages
Unterdrückt die Fehlerausgaben (Standardfehler); sinnvoll bei Skripten
- -v,
--invert-match
Zeigt alle Zeilen an, die das Muster nicht enthalten
- -n,
--line-number
Zeigt die Zeilennummer an, in der das Muster gefunden wurde
- -H,
--with-filename
Zeigt die Namen von Verzeichnissen und Dateien, in den das Muster gefunden
wurde
- -l,
--files-with-matches
Nur Anzeige der Namen der Dateien, in denen das Muster gefunden wurde
- -B,
--before-context=
NUM
Zeigt »Anzahl« Zeilen an, die vor der Zeile mit dem Muster liegen
- -A,
--after-context=
NUM
Zeigt »Anzahl« Zeilen an, die der Zeile mit dem Muster folgen
Eine vollständige Liste aller Optionen erhalten Sie, wenn Sie das folgende Skript
auf Ihrem Server ausführen.
|
<?PHP exec("grep help", $var); foreach($var as $help) { echo $help . ’<br>’; } ?>
|
Sie können mit grep nicht nur nach einem Wort suchen, sondern auch mit
regulären Ausdrücken arbeiten. Im Folgenden sehen Sie einen Überblick über
die Möglichkeiten, die Ihnen dabei zur Verfügung stehen.
Reguläre Ausdrücke
ˆ (grep, egrep) |
Beginn einer Zeile |
$ (grep, egrep) |
Ende einer Zeile |
. (grep, egrep) |
Genau ein beliebiges Zeichen |
* (grep, egrep) |
Beliebig viele des vorangegangenen Zeichens |
[] (grep, egrep) |
Ein Zeichenbereich – anstelle von Zeichen können hier vordefinierte
Klassen von Zeichen verwendet werden:
[:alnum:],
[:alpha:], [:cntrl:], [:digit:], [:graph:], [:lower:], [:print:], [:punct:],
[:space:], [:upper:], und [:xdigit:]. |
[ˆ] (grep, egrep) |
Kein Zeichen aus dem Bereich |
\< (grep) |
Am Wortanfang nach dem Muster suchen |
\> (grep) |
Am Wortende nach dem Muster suchen |
\(..\) (grep) |
Eingeschlossenes Muster speichern, auf das man später über
zugreifen kann. Sie können bis zu neun Muster speichern. |
z\{x\} (grep) |
x-faches
Auftreten des Zeichens z |
z\{x,y\} (grep) |
mindestens x-,
maximal y-maliges
Auftreten des Zeichens z |
+ (egrep) |
Das vorangegangene Zeichen muss mindestens einmal auftreten |
? (egrep) |
Das vorangegangene Zeichan darf höchstens einmal auftreten |
x|y (egrep) |
Das Zeichen „x“ oder „y“ |
(abc|xyz) (egrep) |
Eine Zeichenkette „abc“ oder „xyz“. Die runden Klammern
sind nicht zwingend notwendig und können entfallen. |
function copyShellFolder($source, $search)
@param string $source
@param string $search
@return array
Die Funktion copyShellFolder() erwartet als Parameter zum einen eine Datei
oder ein ganzes Verzeichnis, zum anderen das Suchwort oder den regulären
Ausdruck. Den Shell-Befehl
können Sie mit den Optionen und dem regulären
Ausdruck so erweitern, dass er Ihren Bedürfnissen entspricht.
In unserem Beispiel haben wir die Optionen i (ignoriert Groß- und
Kleinschreibung),
H (zeigt den Verzeichnisnamen und die Datei mit den Suchtreffern an)
und die rekursive Verzeichnissuche genommen.
32:
33: 34: 35: 36: 37: 38: 39: 40:
| function copyShellFolder($source, $search){
$shellBefehl = "grep -cH --directories=recurse '$search' $source";
exec($shellBefehl, $var); return $var; } |
Beispiel 11.7: searchShellFile.php
Der Aufruf der Funktion ist mit wenigen Konfigurationsparametern erledigt.
Wir benötigen zum einen eine Datei (42) oder ein ganzes Verzeichnis (43) und zum anderen das Suchwort (45) oder den regulären Ausdruck. Als Rückgabewert
erhalten wir ein Array mit den Suchtreffern (47).
42:
43: 44: 45: 46: 47: 48: 49: | //$source = 'grep.txt';
$source = 'grep/';
$search = 'Sie';
$var = copyShellFolder($source, $search);
print_r($var); |
Beispiel 11.8: searchShellFile.php
Die Ausgabe im Browser zeigt für unser Beispiel, dass die Suche in insgesamt
drei Dateien zum Erfolg geführt hat. Wir haben durch unsere Optionen jetzt
den Dateinamen sowie die Suchtreffer jeder einzelnen Datei in einem Array
vorliegen.
Ausgabe im Browser
Array
(
[0] => grep/grep.txt:12
[1] => grep/grep_1.txt:9
[2] => grep/verz/grep_2.txt:12
) |
Dieses Skript aus dem SELFPHP KOCHBUCH wurde von SELFPHP unter dem "Tarif Mc500" von McAc.net-Webhosting erfolgreich ausgeführt und getestet!
Auf der Übersichtseite unter "McAc.net – Webhosting zu diesem Buch" finden Sie weitere Informationen zu dem Webhostingpaket, dass durch SELFPHP getestet wurde.
Download
|
Alle Beispiele als PHP-Datei(en)
Hier haben Sie die Möglichkeit, sich sämtliche auf dieser Seite gezeigten Beispiele als PHP-Dateien direkt downzuloaden.
Umständliches Copy & Paste ist daher nicht mehr notwendig, da alle Beispiele sofort ausprobiert werden können.
Sie haben bei der Auswahl der bereitgestellten Downloads mehrere Möglichkeiten, je nachdem welches Komprimierungsverfahren Sie bevorzugen.
|
Zurück zur Übersichtsseite
|