2014-05-09 10 views
5

Ich empfange einen Dateinamen in einer Funktion. Ich möchte alle Dateien ähnlich dieser Datei (nach Dateiname) aus einem anderen Verzeichnis zurückgeben. Ich schrieb dies:RegEx Muster in glob Funktion

$thumbDir = $this->files_path.'thumbs/'; 
    $toglob = $thumbDir.pathinfo($name, PATHINFO_FILENAME).'_[0-9]+\x[0-9]+_thb.'.pathinfo($name, PATHINFO_EXTENSION); 
    foreach (glob($toglob) as $key => $value) { 
     echo $value; 
    } 

Aber es funktioniert nicht. Ich suche Dateien, die ihr Dateinamen:

oldFileName_[one or more digits]x[one or more digits]_thb.oldFileNameExtension 

ich sehr dankbar, wenn mir jemand helfen mit dieser :)

Antwort

11

glob() ist wirklich eine quasi-Regex-Engine. Von einem Kommentar zu den Dokumenten, ermöglicht es ein ? und *:

glob verwendet zwei spezielle Symbole, die zwischen einem Meta-Charakter und einem quantifier wie Art einer Mischung handeln. Diese zwei Zeichen sind die * und?

Die? matches 1 jedes Zeichen außer/

Der * entspricht 0 oder mehr von beliebigen Zeichen außer/

Wenn es hilft, denken Sie an die * als pcre Äquivalent. * und? als pcre Äquivalent des Punkt (.)

Das heißt, Sie nicht Ihren Ausdruck _[0-9]+\x[0-9]+_thb. in glob() verwenden können. Stattdessen können Sie im ganzen Verzeichnis suchen und sehen, ob es mit preg_match() matches:

$glob = glob('/path/to/dir/*'); 
foreach($glob as $file) { 
    if(preg_match('/_\d+x\d+_thb\./', $file)) { 
     // Valid match 
     echo $file; 
    } 
} 

erkennen, dass in glob(/path/to/dir/*);, wird die * kein Match / so wird dies keine Dateien in einem Unterverzeichnis erhalten. Es wird nur jede Datei und jedes Verzeichnis in diesem Pfad durchlaufen; Wenn Sie tiefer gehen wollen, müssen Sie eine rekursive Funktion ausführen. I

Hinweis gereinigt Ihre expression:

_\d+x\d+_thb\. 

\d etwa gleich [0-9] (es enthält auch arabische Ziffer Zeichen, etc.), brauchen Sie nicht x (also keine \x) zu entkommen, und Sie wollen Flucht aus der Periode (\.).

+2

hey das ist mein Glob Kommentar du zitiert, mein Tag ist gemacht, hoozah! :) –

+1

@CrayonViolent haha ​​awesome, es war einer der besseren PHP Doc Kommentare, die ich gesehen habe - hatte auch eine gute Anzahl von Upvotes. Sie müssen eine 'glob()' Person sein, wenn Sie über diese Frage gestolpert sind;) – Sam

+0

Danke für die Antwort :) – user3025978