Systemvoraussetzung
- Linux
- Windows
- PHP 4 >= 4.3.0
- PHP 5
Datei(en)
glob.php, glob1.php, glob2.php
Problem
Gerade wenn es darum geht, bestimmte Dateien eines Ordners oder Verzeichnisse
selbst aufzulisten, sieht man immer wieder die Schwierigkeiten. Die
Auflistung funktioniert zwar meistens, aber wenn auch Filterungen mit einbezogen
werden sollen, so scheitert es oftmals.
Es gibt für diesen Fall viele Anwendungsmöglichkeiten wie z. B. :
- Nur JPG-Dateien
eines Verzeichnisses auflisten
- Nur Dateien auflisten, die z. B. mit bestimmten Buchstaben anfangen
- Alle Dateien auflisten, die das Wort Urlaub im Namen haben
- Verzeichnisse auflisten, die den Suchkriterien entsprechen
Wie Sie sehen, muss man sich nur ein wenig Gedanken machen und es bieten
sich sehr viele Anwendungsmöglichkeiten, die mit dieser Filtermethode realisiert
werden können. Daher sollten wir uns mit diesem Thema auch näher
beschäftigen.
Lösung
Die Lösung für dieses Problem können wir mit einer bereits implementierten
Funktion von PHP realisieren. Bei der Funktion handelt es sich um glob(), die
wir für unsere nachfolgenden Beispiele heranziehen werden. Wir werden uns
zuerst die möglichen Schalter und Platzhalter anschauen, um diese dann für
gewisse Aufgaben gezielt einzusetzen.
Unterstützte Schalter
- GLOB_MARK – fügt jedem gefundenen Eintrag einen Slash hinzu. Gerade bei
Verzeichnissen ist dieses wünschenswert, da Dateinamen direkt angehängt
werden können.
- GLOB_NOSORT – deaktiviert die Sortierung. Die Standardeinstellung ist auf
alphabetische Sortierung eingestellt.
- GLOB_NOCHECK – falls kein Eintrag gefunden wird, kann man sich hiermit
das Suchmuster zurückgeben lassen.
- GLOB_NOESCAPE – Metazeichen im Suchtreffer werden nicht mit einem
Backslash versehen. Unter Windows sollten Sie diese Option setzen.
- GLOB_BRACE – setzt einen Platzhalter für mehrere Suchaufzählungen. Der
Platzhalter {a,b,c} findet 'a', 'b', oder 'c'
- GLOB_ONLYDIR – bei der Suche werden nur Verzeichnisse berücksichtigt
(vor PHP 4.3.3 nicht auf Windows verfügbar).
- GLOB_ERR – stoppt bei einem Lesefehler (ab PHP 5.1).
Die Schalter können auch miteinander verbunden werden.
|
glob("[so]*_?.png",GLOB_BRACE|GLOB_ERR) |
Folgende Platzhalter stehen zur Verfügung
- {Platzhalter,Platzhalter} Wurde der Schalter GLOB_BRACE gesetzt, so können
Sie in geschweiften Klammern mehrere Suchbegriffe, getrennt mit
einem Komma, angeben. Dabei handelt es sich dann um eine ODERVerknüpfung.
{*.pdf,*.gif} findet Dateien mit der Endung .pdf oder .gif
Beispiel: glob("{*.png,*.txt}",GLOB_BRACE)
- ? Das Fragezeichen steht für genau ein beliebiges Zeichen.
glob("sonne?1.png") findet z. B. die Datei sonne_1.png
- * Das Sternchen steht für kein oder eine beliebige Anzahl an Zeichen.
glob("so*1.png") findet z. B. die Datei sonne_1.png
- [] Die eckigen Klammern finden genau ein Zeichen aus einer in den Klammern
definierten Zeichengruppe. Wie auch bei den geschweiften Klammern muss
der Schalter GLOB_BRACE gesetzt werden.
[amgz] Genau der Buchstabe „a“ oder „m“ oder „g“ oder „z“.
[ag] Genau die Buchstaben „a“, „b“, „c“, „d“, „e“, „f“ und „g“.
[0-9] Die Zahlen 0-9.
[!aAmgz] Das Ausrufezeichen negiert den Ausdruck. Es darf also nicht „a“,
„A“, „m“, „g“ oder „z“ vorkommen.
Für die nachfolgenden Beispiele wurde folgende Verzeichnisstruktur genommen
(siehe Abbildung 6.2):
Abbildung 6.2: Verzeichnisstruktur
function listPicture($dir=".",$type="jpg")
@param string $dir
@param string $type
@return array $picture
Die Funktion listPicture() erwartet als Parameter zum einen das Verzeichnis
($dir) für die Suche, zum anderen die Dateiendung ($type). Da wir bei dem
Ergebnis mit mehreren Treffern rechnen, speichern wir nachher die Treffer in
einem Array. Wir setzen zuerst den Startwert (13) für die Indizierung unseres
Arrays.
Im nächsten Schritt durchlaufen wir das vollständige übergebene Verzeichnis
und suchen (15) dabei bei jeder Datei nach der geforderten Dateiendung.
Sollte die Funktion glob() in dem Verzeichnis eine Datei mit der gesuchten
Endung finden, speichern wir den Dateinamen (16), die Dateigröße (17) sowie
das Datum (18) der letzten Dateiänderung in unser Array. Diesen Vorgang
wiederholen wir so oft, bis alle Dateien gefunden sind. Im Anschluss daran
geben wir unser Array (22) der aufrufenden Stelle wieder zurück.
12:
13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
|
function listPicture($dir=".",$type="jpg")
{
$x = 0; //foreach (glob($dir."*.".$type) as $filename) sonne_0.png
foreach (glob("[so]*_?.png",GLOB_BRACE|GLOB_ERR) as $filename) {
$picture[$x]['file'] = $filename; $picture[$x]['size'] = filesize($filename) / 1024; $picture[$x]['time'] = filemtime($filename); $x++; } return $picture; } |
Beispiel 6.4: glob.php
Der Aufruf der eben gezeigten Funktion ist in wenigen Schritten erklärt. Sie
müssen lediglich das zu durchsuchende Verzeichnis und die Dateiendung,
nach der Sie suchen wollen, übergeben. Wir haben hier in unserem Beispiel das
Ergebnis nur einfach ausgegeben, Sie können aber eine FOR-Schleife
durchlaufen
und die Ergebnisse gezielter auflisten.
25:
26: 27:
| $pic = listPicture("bilder/","gif");
print_r($pic); |
Beispiel 6.5: glob.php
Ausgabe im Browser
Array
(
[0] => Array
(
[file] => bilder/che.gif
[size] => 1.40234375
[time] => 1145368015
)
[1] => Array
(
[file] => bilder/logo.gif
[size] => 37.4423828125
[time] => 1145368017
)
[2] => Array
(
[file] => bilder/u_blau.gif
[size] => 1.017578125
[time] => 1145368018
)
) |
Ein weiteres Beispiel könnte z. B. folgendes Szenario sein: Sie möchten alle
Dateien auflisten, die als Dateiendung .jpg in ihrem Namen haben. Zusätzlich
muss die Datei entweder mit „b“ oder „f“ beginnen und kann danach beliebige
Zahlen, Buchstaben oder Sonderzeichen im Dateinamen enthalten.
1: 2: 3: 4: 5: 6: 7: 8:
|
<?PHP
foreach (glob("[bf]*.jpg") as $filename) { echo $filename . '<br>'; }
?>
|
Beispiel 6.6: glob1.php
Ausgabe im Browser
bs9tyo_1137603275.jpg
fihedp_1137603349.jpg |
Sie können mit glob() natürlich nicht nur nach Dateien suchen, sondern auch
nach Verzeichnissen. In unserem Beispiel sollen alle Verzeichnisse aufgelistet
werden, die entweder mit einem „c“ oder „g“ beginnen. Für diese spezielle
Suche benutzen wir den Schalter „GLOB_ONLYDIR“.
Da wir im weiteren Verlauf hinter unseren Suchtreffern noch Dateinamen
speichern wollen, soll die Funktion glob() bei jedem Suchtreffer direkt einen
Schrägstrich hinter dem Verzeichnis platzieren. Auch hierfür gibt es einen
Schalter, den wir nutzen können. Wir übergeben der Funktion dabei den
Schalter „GLOB_MARK“.
1: 2: 3: 4: 5: 6: 7: 8:
|
<?PHP
foreach (glob("[cg]*",GLOB_ONLYDIR|GLOB_MARK) as $filename) { echo $filename . '<br>'; }
?>
|
Beispiel 6.7: glob2.php
Ausgabe im Browser
Wie Sie sehen konnten, wurde hier auf einfache Art und Weise ein komplettes
Verzeichnis nach bestimmten Mustern durchsucht. Sie sollten einfach mit
dieser Funktion ein wenig „spielen“, um ihre Wirkungsweise zu erlernen. Anhand
der bereits erklärten Schalter und Platzhalter können Sie gezielt nach
den Verzeichnissen und Dateien suchen, die Sie für Ihre weitere Bearbeitung
nutzen wollen.
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.
|