2010-01-18 4 views
5

Sarebbe bello se qualcuno potesse darmi un modello di espressione regolare per glob per ottenere qui di seguito i nomi dei file:aiuto con il modello glob

1.jpg // this file 
1_thumb.jpg 
2.png // this file 
2_thumb.png 
etc... 

restituzione dei file senza "_thumb". Ho questo schema:

$numericalFiles = glob("$this->path/*_thumb.*"); 

e che mi dà tutto con "_thumb".

risposta

6

glob() non è il massimo a gestire situazioni in cui si hanno esigenze complesse per la corrispondenza dei file, come avete ben notato. Ti consiglio di utilizzare la libreria SPL di PHP e di sfruttare la classe DirectoryIterator.

$iterator = new DirectoryIterator("/dir/path"); 
foreach ($iterator as $file) { 
    if ($file->isFile() && preg_match("/^[0-9]+\./i",$file->getFilename())) { 
     echo $file->getFilename(); 
    } 
} 

È possibile modificare il criterio in modo pulito durante l'iterazione (anche, è facile da modificare l'iteratore se mai bisogno recursive directory iteration).

+1

Ma è * possibile * che 'glob()' possa essere gestito dalla libc, quindi partire da esso significa che si andrà a scorrere con meno risultati nel PHP molto più lento. –

3

Gli schemi glob e le espressioni regolari sono diversi. Ma l'implementazione glob di PHP non implementa la negazione del pattern richiesta per far corrispondere solo quei file. Sarà necessario utilizzare un modello positivo più ampio come [0-9]*.jpg e successivamente filtrare i risultati.

3
foreach (glob('[0-9]*') as $filename) { 
    if (strpos("$filename","_thumb") === FALSE){ 
     echo "$filename \n"; 
    } 
} 
1

A seguito zombat's use del DirectoryIterator, potrebbe anche avere un senso per costruire la propria classe filtro specializzato per rendere la vita più facile (si veda la differenza con gli foreach loop) e più riutilizzabili.

class DirectoryFilterThumbs extends FilterIterator { 
    public function __construct($path) { 
     parent::__construct(new DirectoryIterator($path)); 
    } 
    public function accept() { 
     // Use regex or whatever you like here 
     return ($this->isFile() && strpos($this->getFilename(), "_thumb.") === FALSE); 
    } 
} 

$files = new DirectoryFilterThumbs("/dir/path"); 
foreach ($files as $file) { 
    echo $file->getFilename() . PHP_EOL; 
} 

Naturalmente, se non v'è alcuna necessità di farlo in luoghi diversi, allora la pianura DirectoryIterator/condizione combo data dal zombat è perfettamente adatto.