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

我想要一个目录中的所有CSV文件,所以我使用

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

但是,这不会find带有小写CSV扩展名的文件。

可以使用

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

但有没有办法让所有混合的情况下的版本? 或者这只是glob()的限制?

Glob模式支持字符范围:

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

你可以做到这一点

 $files = glob('my/dir/*'); $csvFiles = preg_grep('/\.csv$/i', $files); 

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

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

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

性能明智这可能不是最好的select,例如,如果你有一百万文件不是文件夹中的CSV文件。

您可以编写自己的不区分大小写的glob。 这是我写的一个个人networking库:

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

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

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

为了使它适用于所有的扩展使用:

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