Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Geleitwort
Vorwort
1 PEAR – Einführung
2 Authentication
3 Caching
4 Date and Time
5 File Formats
6 HTTP
7 Internationalization
8 Mail
9 Networking
10 PHP
11 Text
12 Web Services
13 Benchmarking
14 Configuration
15 Database
16 File System
17 HTML
18 Images
19 Logging
20 Math
21 Numbers
22 Tools and Utilities
23 XML
24 Selbst Pakete erstellen
25 PECL
Index
Ihre Meinung?

Spacer
 <<   zurück
PHP PEAR von Carsten Möhrke
Anwendung und Entwicklung – Erweiterungen für PHP schreiben
Buch: PHP PEAR

PHP PEAR
798 S., 39,90 Euro
Rheinwerk Computing
ISBN 3-89842-580-0
gp 16 File System
  gp 16.1 File
  gp 16.2 File_Find
  gp 16.3 File_SearchReplace


Rheinwerk Computing

16.2 File_Find  toptop


Besprochene Version: 0.3.1 Lizenz: PHP-Lizenz
Klassendatei(en): File/Find.php

File_Find ist eine kleine, aber feine Klasse, mit der Sie nach Dateien bzw. nach Verzeichnissen mit einem bestimmten Namen suchen können. Angenehm ist hierbei, dass das Paket nicht nur einfach nach Strings suchen kann, sondern reguläre Ausdrücke in PCRE- oder PHP-Syntax nutzt.

Um Namen von Dateien oder Unterverzeichnissen nach einem bestimmten Muster zu durchsuchen, ist die Methode search() vorgesehen. Sie bekommt den regulären Ausdruck als ersten Parameter übergeben. Der zweite Parameter definiert, in welchem Verzeichnis der Start der Suche erfolgen soll. Bei ihrer Suche steigt die Methode automatisch in alle untergeordneten Verzeichnisse herab. Der dritte Parameter darf entweder 'perl' oder 'php' sein und definiert, in welcher Syntax der reguläre Ausdruck vorliegt. Geben Sie diesen letzten Parameter nicht an, ist die PHP- bzw. POSIX-Syntax automatisch der Standard, was auch dann der Fall ist, wenn Sie 'php' übergeben. Allerdings sollten Sie – wenn möglich – die PCRE-Syntax (Parameter 'perl') nutzen, weil sie flexibler ist und die Ausdrücke wesentlich schneller abgearbeitet werden.

Die Parameter der Methode glob() sind identisch mit denen von search(). glob() liest allerdings keine Unterverzeichnisse ein, sondern beschränkt sich bei der Suche auf das angegebene Verzeichnis. Auf Basis dieser Funktionen können Sie ein kleines Suchformular aufbauen, das nach bestimmten Dateien oder Verzeichnissen sucht:

<html> 
   <head><title></title></head> 
   <body> 
<?php 
   // Soll das Forumular ausgegeben oder gesucht werden? 
   if (false===isset($_POST['search'])) 
   { 
?> 
   <form method="post"> 
      Suchen nach <input type="text" name="search" /><br /> 
      Gro&szlig;-/Kleinschreibung unterscheiden? 
      <input type="checkbox" name="case" /> Ja<br /> 
      In Unterverzeichnisse herabsteigen? 
      <input type="checkbox" name="follow" /> Ja<br /> 
      <input type="submit" value="Suchen" /> 
   </form> 
<?php 
   } 
   else 
   { 
      require_once('File/Find.php'); 
      // Neues Objekt ableiten 
      $ff = new File_Find(); 
 
      // Regulaeren Ausdruck fuer die Suche bauen 
      $regex="/$_POST[search]/"; 
 
      // Soll case-sensitive gesucht werden? 
      if (false === isset($_POST['case'])) 
      { 
         $regex="{$regex}i"; 
      } 
      // Welche Methode soll fuer die Suche 
      // genutzt werden? 
      if (true === isset ($_POST['follow'])) 
      { 
         $mode = 'search'; 
      } 
      else 
      { 
         $mode = 'glob'; 
      } 
 
      // $mode wird zu glob oder search aufgeloest 
      $erg = $ff->{$mode}($regex,'.', 'perl' ) ; 
      if (true===PEAR::isError($erg)) 
      { 
         die ($erg->getMessage()); 
      } 
      // Wurde mindestens ein Treffer gefunden? 
      if (0!=count($erg)) 
      { 
         echo '<b><u>Suchergebnis</u></b><br />'; 
         foreach ($erg as $datei) 
         { 
            echo "$datei<br />"; 
         } 
      } 
      else 
      { 
         echo 'Keine Treffer'; 
      } 
   } 
   ?> 
   </body> 
</html>

Listing 16.4 Einfaches Suchformular mit PEAR::File_Find

Diese Methoden werden noch durch mapTree() und mapTreeMultiple() ergänzt. maptree() bekommt den Namen eines Verzeichnisses übergeben und liefert ein Array, das wiederum zwei Arrays enthält. Das erste enthält die Namen aller Verzeichnisse und das zweite die Namen und Pfade aller Dateien, die sich in diesem Verzeichnis bzw. darunter befinden. Die Rückgabe von mapTree() könnte also beispielsweise so aussehen (stark gekürzt):

Array 
( 
   [0] => Array 
      ( 
         [0] => .. 
         [1] => ../bb 
         [2] => ../bb/phpBB2 
         [3] => ../bb/phpBB2/templates 
         [4] => ../bb/phpBB2/templates/subSilver 
      ) 
   [1] => Array 
      ( 
         [0] => ../.directory 
         [1] => ../index.php 
         [2] => ../text.php 
         [3] => ../log.php 
         // Viele weitere Eintraege 
         [83] => ../bb/phpBB2/common.php 
         [84] => ../bb/phpBB2/config.php 
         [85] => ../bb/phpBB2/extension.inc 
      ) 
)

mapTreeMultiple() arbeitet ähnlich, nur werden die Arrays in diesem Fall ineinander verschachtelt. Die Dateien, die in einem Verzeichnis liegen, werden hierbei durchnummeriert. Wird in einem Verzeichnis ein Unterverzeichnis gefunden, so wird der Name des Verzeichnisses als Schlüssel genutzt, unter dem ein neues Array eingefügt wird. In diesem neuen Array befinden sich dann alle Dateinamen, die in diesem Verzeichnis zu finden sind. Somit ergibt sich ein Array wie dieses:

Array 
( 
   [0] => index.php 
   [1] => text.php 
   // Weitere Eintraege 
   [98] => pw.php 
   [pear] => Array 
      ( 
         [0] => .htaccess 
         [1] => .htpasswd 
      ) 
)

Die Methode akzeptiert aber noch einen zweiten Parameter, mit dem Sie definieren können, bis zu welcher Tiefe der Verzeichnisbaum durchlaufen werden soll. Geben Sie eine 1 an, werden nur die Dateien des aktuellen Verzeichnisses, nicht aber die untergeordneten Verzeichnisse ausgegeben. Mit einer 2 wird die nächste Ebene mit ausgegeben usw.

 <<   zurück
     
  Zum Katalog
Zum Katalog: PHP PEAR
PHP PEAR
Jetzt bestellen!
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: PHP 5.6 und MySQL 5.7






 PHP 5.6 und
 MySQL 5.7


Zum Katalog: Einstieg in PHP 5.6 und MySQL 5.6






 Einstieg in PHP 5.6
 und MySQL 5.6


Zum Katalog: Responsive Webdesign






 Responsive Webdesign


Zum Katalog: Moderne Websites entwickeln






 Moderne Websites
 entwickeln


Zum Katalog: MySQL 5.6






 MySQL 5.6


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo








Copyright © Rheinwerk Verlag GmbH 2007
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Rheinwerk Computing]

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de