2014-05-09 8 views
5

Ricevo un nome file in una funzione. Voglio restituire tutti i file simili a questo file (per nome file) da un'altra directory. Ho scritto questo:RegEx pattern in glob function

$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; 
    } 

Ma non funziona. Cerco i file che il loro nome è:

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

sarò molto grato se qualcuno mi aiuti con questo :)

risposta

11

glob() è davvero un motore di quasi-regex. Da un commento sui documenti, permette una ? e un *:

glob utilizza due simboli speciali che agiscono come una sorta di mix tra un meta-carattere e un quantificatore. Questi due personaggi sono * e?

Il? corrisponde a 1 di qualsiasi carattere, ad eccezione/

Il * corrisponde a 0 o più di qualsiasi carattere, ad eccezione/

Se aiuta, pensare al * come pcre equivalente di. * e? come il PCRE equivalente del punto (.)

Questo significa che non è possibile usare la vostra espressione _[0-9]+\x[0-9]+_thb. in glob(). Invece, si può guardare in tutta la directory e vedere se corrisponde con preg_match():

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

rendo conto che in glob(/path/to/dir/*);, il * non corrisponde a un / quindi questo non sarà possibile ottenere alcun file nelle sottodirectory. Passerà solo attraverso ogni file e directory in quel percorso; se vuoi andare più a fondo, dovrai fare una funzione ricorsiva.

Nota ho pulito il vostro expression:

_\d+x\d+_thb\. 

\d equivale grosso modo [0-9] (che comprende anche i caratteri cifre arabe, ecc), non è necessario per sfuggire x (quindi non \x), e si desidera sfuggire al periodo (\.).

+2

hey, questo è il mio commento glob che hai citato, la mia giornata è fatta, hoozah! :) –

+1

@CrayonViolent haha ​​awesome, è stato uno dei migliori commenti di PHP doc che ho visto - ha avuto anche un buon numero di upvotes. Devi essere una persona 'glob()' se ti sei imbattuto in questa domanda;) – Sam

+0

Grazie per la risposta :) – user3025978