Est-ce que glob() de PHP peut être fait pour trouver des fichiers d'une manière insensible à la casse?
je veux tous les fichiers CSV dans un répertoire, donc j'utilise
glob('my/dir/*.CSV')
ceci ne trouve cependant pas les fichiers avec une extension CSV en minuscules.
I utiliser
glob('my/dir/*.{CSV,csv}', GLOB_BRACE);
mais y a-t-il un moyen d'autoriser toutes les versions de cas mixtes? Ou est-ce juste une limitation de glob()
?
8 réponses
Glob modèles supportent les plages de caractères:
glob('my/dir/*.[cC][sS][vV]')
Vous pouvez faire cela
$files = glob('my/dir/*');
$csvFiles = preg_grep('/\.csv$/i', $files);
glob('my/dir/*.[cC][sS][vV]')
devrait le faire. Ouais c'est un peu laid.
Vous pouvez également filtrer les fichiers après avoir sélectionné tous
foreach(glob('my/dir/*') as $file){
$ext = strtolower(pathinfo($file, PATHINFO_EXTENSION));
if(!in_array($ext, array('csv'))){
continue;
}
... do stuff ...
}
performance sage est peut-être pas la meilleure option si par exemple, vous avez 1 million de fichiers qui ne sont pas csv dans le dossier.
Vous pouvez écrire votre propre casse glob. C'est à partir d'un site web personnel de la bibliothèque j'écris:
/** 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);
}
j'ai entendu parler d'une fonction qui peut être utilisée comme ceci: Essayez si cela fonctionne pour vous!
<?php
$pattern = sql_regcase("*.txt");
glob($pattern);
?>
Venu sur ce lien pour glob avec plusieurs fichiers. Bien que cela n'aide pas pour L'OP, cela peut aider d'autres qui finissent ici.
$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);
Pour le faire fonctionner avec toutes les extensions d'utilisation:
$extension = 'some_extension';
glob('my/dir/*.preg_replace('/(\w)/e', "'['.strtoupper().strtolower().']'", $extension));