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() ?

38
demandé sur alex 2010-03-26 04:27:00

8 réponses

Glob modèles supportent les plages de caractères:

glob('my/dir/*.[cC][sS][vV]')
51
répondu Ignacio Vazquez-Abrams 2010-03-26 01:37:22

Vous pouvez faire cela

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

$csvFiles =  preg_grep('/\.csv$/i', $files);
33
répondu alex 2010-03-26 01:33:04

glob('my/dir/*.[cC][sS][vV]') devrait le faire. Ouais c'est un peu laid.

6
répondu intuited 2010-03-26 01:45:20

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.

2
répondu Timo Huovinen 2014-10-08 12:15:06

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);
    }
0
répondu Oli Comber 2014-02-13 10:51:00

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);
?>
0
répondu Jerry 2015-03-30 23:35:38

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);
0
répondu user3058870 2018-03-02 19:36:00

Pour le faire fonctionner avec toutes les extensions d'utilisation:

$extension = 'some_extension';
glob('my/dir/*.preg_replace('/(\w)/e', "'['.strtoupper().strtolower().']'", $extension));
-1
répondu Dan Bray 2017-03-04 00:58:21