2008-11-26 23 views
15

Estoy leyendo todos los archivos en un solo directorio y quiero filtrar en JPG, JPEG, GIF y PNG.Comprobación de extensiones de archivos en PHP con expresiones regulares

Tanto letras mayúsculas como minúsculas. Esos son los únicos archivos para ser aceptados.

Actualmente estoy usando esto:

$testPics = takeFiles($picsDir, "([^\s]+(?=\.(jpg|JPG|jpeg|JPEG|png|PNG|gif|GIF))\.\2)"); 

y los takeFiles función tiene el siguiente aspecto:

function takerFiles($dir, $rex="") { 
    $dir .= "/"; 
    $files = array(); 
    $dp = opendir($dir); 
    while ($file = readdir($dp)) { 
     if ($file == '.') continue; 
     if ($file == '..') continue; 
     if (is_dir($file)) continue; 
     if ($rex!="" && !preg_match($rex, $file)) continue; 
     $files[] = $file; 
    } 
    closedir($dp); 
    return $files; 
    } 

Y siempre devuelve nada. Entonces algo debe estar mal con mi código de expresiones regulares.

Respuesta

30

Creo que algo está mal con su expresión regular. Intente probar expresiones regulares aquí primero: http://www.spaweditor.com/scripts/regex/index.php

Creo que éste podría funcionar para usted:

/^.*\.(jpg|jpeg|png|gif)$/i

Nota del/i al final - esto es la bandera "sensible a mayúsculas", le ahorra tener que escribe todas las permutaciones :)

+1

que tendrá que escapar del punto. – Mark

+1

Gracias Marcar, arreglado. D'oh! –

+0

@PhillSacre el enlace a SpawEditor ha expirado. ¿Puedes actualizar tu respuesta? –

1

Debes poner barras alrededor de tu expresión regular. -> "/(...)/"

11

¿Qué tal si usas glob()?

$files = glob($dir . '*.{jpg,gif,png,jpeg}',GLOB_BRACE); 
+1

Como nota al margen, asegúrese de que $ dir finalice con un separador de directorio. – Powerlord

+0

¿Hay alguna manera de usar esta función y solo devolver nombres de archivos sin la ruta completa? –

0

Existen varias maneras de hacerlo.

has necesitado glob():?

$files = glob("{$picsDir}/*.{gif,jpeg,jpg,png}", GLOB_BRACE); 

¿Usted ha considerado pathinfo():?

$info = pathinfo($file); 
switch(strtolower($info['extension'])) { 
    case 'jpeg': 
    case 'jpg': 
    case 'gif': 
    case 'png': 
     $files[] = $file; 
     break; 
} 

Si usted es insistente en el uso de la expresión regular, no hay necesidad para que coincida con todo el nombre del archivo, solo la extensión Utilice el token $ para que coincida con el final de la cadena, y use el indicador i para denotar insensibilidad a mayúsculas y minúsculas. Además, no se olvide de usar un delimitador en su expresión, en mi caso "%":

$rex = '%\.(gif|jpe?g|png)$%i'; 
2

¿Hay alguna razón usted no desea utilizar scandir y pathinfo?

public function scanForFiles($path, array $exts) 
{ 
    $files = scanDir($path); 

    $return = array(); 

    foreach($files as $file) 
    { 
     if($file != '.' && $file != '..') 
     { 
      if(in_array(pathinfo($file, PATHINFO_EXTENSION), $exts))) { 
       $return[] = $file; 
      } 
     } 
    } 

    return $return; 
} 

Así también se puede comprobar si el archivo es un directorio y hace una llamada recursiva para escanear ese directorio. Escribí el código a toda prisa, por lo que podría no ser 100% correcto.

+0

Este contestador debe estar en la parte superior. Regexp a menudo son excesivos. Los amo, pero debes atenerse a KISS cuando sea posible. –

1

Esto funciona para mí

$string = "your-file-name.jpg"; 
preg_match("/\b(\.jpg|\.JPG|\.png|\.PNG|\.gif|\.GIF)\b/", $string, $output_array); 

mejor.

0

Aquí hay dos maneras diferentes de compilar una matriz de archivos por tipo (conf para demostración) desde un directorio de destino. No estoy seguro de cuál es mejor en cuanto a rendimiento.

$path = '/etc/apache2/'; 
    $conf_files = []; 

    // Remove . and .. from the returned array from scandir 
    $files = array_diff(scandir($path), array('.', '..')); 
    foreach($files as $file) { 
     if(in_array(pathinfo($file, PATHINFO_EXTENSION), ['conf'])) { 
      $conf_files[] = $file; 
     } 
    } 
    return $conf_files; 

Esto devolverá la ruta completa del archivo no sólo el nombre de archivo

return $files = glob($path . '*.{conf}',GLOB_BRACE); 
Cuestiones relacionadas