Teil von  SELFPHP
  +++ SELFPHP CronJob-Service :: Jetzt auch als Professional-Version verfügbar! +++

:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: SELFPHP Forum ::

Fragen rund um die Themen PHP? In über 120.000 Beiträgen finden Sie sicher die passende Antwort!  

 

:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 

:: Qozido ::

Die Bilderverwaltung mit Logbuch für Taucher und Schnorchler.   

 
 
Suchen in Dateien


Systemvoraussetzung

  • Linux
  • PHP 3
  • PHP 4
  • PHP 5

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 \1 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.


 




:: Premium-Partner ::

Webhosting/Serverlösungen


Premium-Partner LeaseWeb Germany GmbH
Premium-Partner MECO Systemhaus GmbH & Co. KG
Premium-Partner PSW GROUP GmbH & Co. KG
Premium-Partner BPI-Systeme
Premium-Partner Pixel X
Premium-Partner
 

:: SELFPHP Sponsoren ::


DM Solutions
Microsoft Deutschland GmbH
Sedo - Bei uns wird PHP großgeschrieben
hostfactory.ch - OptimaNet Schweiz AG
ZEND - The PHP Company
Kaspersky Labs
HighText iBusiness
SELFPHP Sponsoren
 

Qozido


© 2001-2013 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt