2010-01-18 8 views
5

Sería bueno si alguien me podría dar un patrón de expresión regular para pegote para obtener los nombres de archivo a continuación:ayuda con patrón global

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

la devolución de los archivos sin "_thumb". Tengo este patrón:

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

y eso me da todo con "_thumb."

Respuesta

6

glob() no es el más grande en el manejo de situaciones en las que tienen requisitos complejos para la coincidencia de archivo, como usted ha notado claramente. Recomiendo usar la biblioteca SPL de PHP y aprovechar la clase DirectoryIterator.

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

Puede modificar los criterios limpiamente durante la iteración (también, es fácil de modificar el iterador si alguna vez necesitaba recursive directory iteration).

+1

Pero * es * posible que 'glob()' pueda ser manejado por la libc, por lo que comenzar con esto significa iterar a través de menos resultados en PHP mucho más lento. –

3

Los patrones Glob y las expresiones regulares son diferentes. Pero la implementación global de PHP no implementa la negación de patrones requerida para hacer coincidir solo esos archivos. Tendrá que utilizar un patrón positivo más grande como [0-9]*.jpg y luego filtrar los resultados después.

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

Además de zombat's use del DirectoryIterator, también podría tener sentido crear su propia clase de filtro especializado para facilitar la vida (vea la diferencia con los bucles foreach) y más reutilizable.

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

Por supuesto, si no hay necesidad de hacer esto en varios lugares a continuación, la llanura DirectoryIterator/combo condición dada por zombat es perfectamente adecuado.