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