2010-03-26 13 views
36

Voglio tutti i file CSV in una directory, per cui usoÈ possibile eseguire glob() di PHP per trovare i file senza distinzione tra maiuscole e minuscole?

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

Questo però non trova i file con estensione CSV minuscolo.

ho potuto uso

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

Ma c'è un modo per consentire tutte le versioni miste caso? O è solo una limitazione di glob()?

+0

Solo una nota che 'glob()' in realtà non fa distinzione tra maiuscole e minuscole in Windows (e probabilmente altri file system insensibili). –

+0

Questo non è vero. 'glob (" *. CSV ")' troverà solo i file maiuscoli, mentre 'glob (" *. csv ")' troverà solo i file minuscoli. --- testato in windows7 con php 5.3.8 – Radon8472

risposta

47

modelli Glob supportano intervalli di caratteri:

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

Ma non corrisponderà anche a nessun file che termina con ".Csv" o ".CsV"? Ma questo è un punto di contatto: quello che sto cercando è uno schema che abbinerà tutti i file di immagine in un modo insensibile alle maiuscole/minuscole (jpg, JPG, png, PNG, ecc.). – JohnK

+3

@JohnK: "Ma c'è un modo per consentire tutte le versioni di case miste?" –

27

Si potrebbe fare questo

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

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

Molto pulito e flessibile. – concept

+2

Accetto. Sembra che non sia possibile combinare GLOB_BRACE con intervalli di caratteri, quindi ho finito con l'uso di glob + preg_grep per eseguire una ricerca senza distinzione tra maiuscole e minuscole di più formati di file contemporaneamente. Grazie per il consiglio! –

+0

Questa è la soluzione più utile imo. – Jonathan

5

glob('my/dir/*.[cC][sS][vV]') dovrebbe farlo. Sì, è un po 'brutto.

0

È possibile scrivere il proprio glob senza distinzione tra maiuscole e minuscole. Questo è da una libreria web personale scrivo:

/** 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

È inoltre possibile filtrare i file dopo aver selezionato tutti loro

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

prestazioni saggio questo potrebbe non essere la migliore opzione se per esempio avete 1 milione di file che non sono csv nella cartella.

0

Ho sentito parlare di una funzione che può essere utilizzata in questo modo: Prova se questo funziona per te!

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

Interessante. Tuttavia, il suo uso è stato deprecato. – alex

-1

Per farlo funzionare con tutte le estensioni d'uso:

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

Perché il downvote? –

+1

non posso parlare per chiunque abbia votato, ma un paio di punti (spero utili): (1) la stringa del tuo percorso manca la chiusura ''', e (2) la bandiera PCRE' e' (eval) è deprecato da PHP 5.5 e rimosso in 7, entrambi sono più vecchi di questa risposta. Il suo utilizzo è scoraggiato. – cautionbug

+0

'preg_replace()' viene utilizzato inutilmente. Potresti 'explode()', 'map()', restituisce le varianti del caso e quindi 'join()'. – alex

0

venuto a questo collegamento per glob con più file. Anche se non aiuta con OP, può aiutare gli altri che finiscono qui.

$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' come' '0''? Perché? – alex

+0

0 è il primo elemento dell'array – user3058870

+0

Voglio dire, lo stai usando come indice di loop, ma definendolo come una stringa. – alex

Problemi correlati