PHP的glob()可以以不区分大小写的方式查找文件吗?

时间:2010-03-26 01:27:01

标签: php case-insensitive glob

我想将所有CSV文件放在目录中,所以我使用

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

然而,这找不到具有小写CSV扩展名的文件。

可以使用

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

但有没有办法允许所有混合案例版本?或者这只是glob()的限制?

10 个答案:

答案 0 :(得分:55)

全局模式支持字符范围:

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

答案 1 :(得分:37)

你可以这样做

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

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

答案 2 :(得分:6)

glob('my/dir/*.[cC][sS][vV]')应该这样做。是的,它有点难看。

答案 3 :(得分:2)

您也可以在选择所有文件后过滤掉文件

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

性能明智这可能不是最佳选择,例如,如果文件夹中有100万个不是csv的文件。

答案 4 :(得分:0)

您可以编写自己的不区分大小写的glob。这来自我写的个人网站:

/** 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);
    }

答案 5 :(得分:0)

我听说过一个可以像这样使用的函数: 试试这是否适合你!

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

答案 6 :(得分:0)

来到这个包含多个文件的glob的链接。虽然它对OP没有帮助,但它可能会帮助那些最终来到这里的人。

$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);

答案 7 :(得分:0)

此代码对我有用,仅获取图像且不区分大小写。

图像列表:

  • image1.jpg
  • image2.JPG
  • image3.jpg
  • image4.GIF
$imageOnly = '*.{[jJ][pP][gG],[jJ][pP][eE][gG],[pP][nN][gG],[gG][iI][fF]}';
$arr_files = (array) glob($path . $imageOnly, GLOB_BRACE);

也许看起来很丑,但是您只需声明一次$ imageOnly即可在需要的地方使用它。您还可以声明$ jpgOnly等。

我什至创建了创建此模式的函数。

/*--------------------------------------------------------------------------
 * create case insensitive patterns for glob or simular functions
 * ['jpg','gif'] as input
 * converted to: *.{[Jj][Pp][Gg],[Gg][Ii][Ff]}
 */
function globCaseInsensitivePattern($arr_extensions = []) {
   $opbouw = '';
   $comma = '';
   foreach ($arr_extensions as $ext) {
       $opbouw .= $comma;
       $comma = ',';
       foreach (str_split($ext) as $letter) {
           $opbouw .= '[' . strtoupper($letter) . strtolower($letter) . ']';
       }
   }
   if ($opbouw) {
       return '*.{' . $opbouw . '}';
   }
   // if no pattern given show all
   return '*';
} // end function

$arr_extensions = [
        'jpg',
        'jpeg',
        'png',
        'gif',
    ];
$imageOnly = globCaseInsensitivePattern($arr_extensions);
$arr_files = (array) glob($path . $imageOnly, GLOB_BRACE);

答案 8 :(得分:0)

以Alex的技巧为基础,这通常可以有所帮助:

   <div style={{ /*your media queries */ }} ></div>

其中function glob_files ($d, $e) { $files = preg_grep ("/$e\$/i", glob ("$d/*")); sort ($files) return $files; } 是目录,$d是扩展名。

答案 9 :(得分:-1)

要使其适用于所有扩展程序,请使用:

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