Teil von  SELFPHP
Letztes Update: 14.09.2007 09:07:01

Navigation

Seite Startseite
Seite Aktuelles
Seite Seite News*
Seite Seite Pressemitteilungen*
Seite SELFPHP
Seite Seite Über SELFPHP
Seite Seite Werbung
Seite Seite Kontakt
Seite Seite Unsere Banner
Seite Seite Impressum
Seite Qozido
Seite Seite Diving Edition
Seite Seite Snorkeling Edition
Seite SELFPHP Dokumentation
Seite Seite PHP-Skripte
Seite Seite PHP Befehlsreferenz
Seite Seite PHP 5 Praxisbuch
Seite Seite PHP Code Snippets
Seite Seite SELFPHP in Buchform
Seite Anbieterverzeichnis
Seite Seite Globale Branchen
Seite Seite Webhosting/Server
Seite Services
Seite Seite Forum*
Seite Seite RSS-Feeds*
Seite Seite Downloads*
Seite Seite Gratis-Video-Lektionen*
Seite Seite SELFPHP auf Heft-CD*
Seite Seite Newsletter*
Seite Internet Security
 sponsored by  
Seite Stellenangebote*
Sedo - Bei uns wird PHP großgeschrieben
Seite Premium-Partner   
Webhosting/Serverlösungen
Seite Produktempfehlung   
Seite Seite SteadyBackup

 
* Link führt ins Internet


Anbieterverzeichnis
Informieren Sie sich über die Unternehmen in unserem Anbieterverzeichnis!  
 


SELFPHP Forum
Fragen rund um die Themen PHP? In über 100.000 Beiträgen finden Sie sicher die passende Antwort!*  


Newsletter
Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!*

Vorname: 
Name:
E-Mail:
 




 

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
)


 




 sponsored by

Sedo - Bei uns wird PHP großgeschrieben


VERIO - An NTT Communications Company


HighText iBusiness


Webspace-Verkauf.de


video2brain




 Premium-Partner
 Webhosting/Serverlösungen

BPI-Systeme


Premium-Partner Pixel X


Premium-Partner First Colo


Premium-Partner dogado Internet




Qozido


© 2001-2008 E-Mail SELFPHP - Damir Enseleit, info@selfphp.deImpressumKontakt