2010-03-26 17 views
36

Quiero que todos los archivos CSV en un directorio, así que uso¿Se puede hacer que el glob() de PHP busque archivos de manera que no distinga entre mayúsculas y minúsculas?

glob('my/dir/*.CSV') 

Sin embargo, esto no encontrar archivos con la extensión CSV minúsculas.

que podía uso

glob('my/dir/*.{CSV,csv}', GLOB_BRACE); 

Pero hay una manera para permitir que todas las versiones de casos mixtos? ¿O es solo una limitación de glob()?

+0

Sólo una nota que 'glob()' es en realidad entre mayúsculas y minúsculas en Windows (y posiblemente otros sistemas de archivos y minúsculas). –

+0

Eso no es verdad. 'glob (" *. CSV ")' solo encontrará archivos en mayúsculas, mientras que 'glob (" *. csv ")' solo encontrará archivos en minúsculas. --- probado en windows7 con php 5.3.8 – Radon8472

Respuesta

47

patrones globales soportan rangos de caracteres:

glob('my/dir/*.[cC][sS][vV]') 
+1

¿Pero no coincidirá también con cualquier archivo que termine en ".Csv" o ".CsV"? Pero eso es un punto secundario: lo que estoy buscando es un patrón que coincida con todos los archivos de imagen de una manera insensible (jpg, JPG, png, PNG, etc.). – JohnK

+3

@JohnK: "¿Pero hay alguna manera de permitir todas las versiones de casos mixtos?" –

27

usted puede hacer esto

$files = glob('my/dir/*'); 

$csvFiles = preg_grep('/\.csv$/i', $files); 
+0

Muy limpio y flexible. – concept

+2

De acuerdo. Parece que no puedes combinar GLOB_BRACE con rangos de caracteres, así que terminé usando glob + preg_grep para hacer una búsqueda insensible a mayúsculas y minúsculas de varios formatos de archivo a la vez. ¡Gracias por el consejo! –

+0

Esta es la solución más útil imo. – Jonathan

5

glob('my/dir/*.[cC][sS][vV]') debe hacerlo. Sí, es algo feo.

0

Puede escribir su propio glob insensible a mayúsculas y minúsculas. Esto es de una biblioteca web personal que escribo:

/** PHP has no case insensitive globbing 
* so we have to build our own. 
* 
* $base will be the initial part of the path which doesn't need case insensitive 
* globbing. 
* Suffix is similar - it will not be made insensitive 
* Make good use of $base and $suffix to keep $pat simple and fast in use. 
*/ 
    function ciGlob($pat, $base = '', $suffix = '') 
    { 
     $p = $base; 
     for($x=0; $x<strlen($pat); $x++) 
     { 
      $c = substr($pat, $x, 1); 
      if(preg_match("/[^A-Za-z]/", $c)) 
      { 
       $p .= $c; 
       continue; 
      } 
      $a = strtolower($c); 
      $b = strtoupper($c); 
      $p .= "[{$a}{$b}]"; 
     } 
     $p .= $suffix; 
     return glob($p); 
    } 
2

También puede filtrar los archivos después de seleccionar todos ellos

foreach(glob('my/dir/*') as $file){ 
    $ext = strtolower(pathinfo($file, PATHINFO_EXTENSION)); 
    if(!in_array($ext, array('csv'))){ 
     continue; 
    } 
    ... do stuff ... 
} 

se refiere a rendimiento esto podría no ser la mejor opción si por ejemplo usted tiene 1 millón de archivos que no son csv en la carpeta.

0

Escuché acerca de una función que se puede usar así: ¡Intente si eso funciona para usted!

<?php 
$pattern = sql_regcase("*.txt"); 
glob($pattern); 
?> 
+0

Interesante. Sin embargo, su uso ha quedado en desuso. – alex

-1

Para que funcione con todas las extensiones de usar:

$extension = 'some_extension'; 
glob('my/dir/*.preg_replace('/(\w)/e', "'['.strtoupper($1).strtolower($1).']'", $extension)); 
+0

¿Por qué el voto a favor? –

+1

No puedo hablar por quien votó menos, pero un par de (afortunadamente útiles) puntos: (1) su cadena de ruta falta el '' 'de cierre, y (2) la bandera PCRE' e' (eval) está en desuso a partir de PHP 5.5 y eliminado en 7, los cuales son más antiguos que esta respuesta. Su uso es desaconsejado. – cautionbug

+0

'preg_replace()' se usa innecesariamente. Podría 'explotar()', 'mapa()', devolver las variantes de caso y luego 'join()'. – alex

0

vino a este enlace para pegote con múltiples archivos. Aunque no ayuda con OP, puede ayudar a otros que terminan aquí.

$file_type = 'csv,jpeg,gif,png,jpg'; 
$i = '0'; 
foreach(explode(",",$file_type) as $row){ 
    if ($i == '0') { 
     $file_types = $row.','.strtoupper($row); 
    } else { 
     $file_types .= ','.$row.','.strtoupper($row); 
    } 
    $i++; 
} 

$files = glob($dir."*.{".$image_types."}",GLOB_BRACE); 
+0

'$ i' as' '0''? ¿Por qué? – alex

+0

0 es el primer elemento en la matriz – user3058870

+0

Es decir, lo está utilizando como un índice de bucle, pero definiéndolo como una cadena. – alex

Cuestiones relacionadas