Я хочу, чтобы все файлы CSV в каталоге, поэтому я использую
glob('my/dir/*.CSV')
Это, однако, не находит файлы с строчным расширением 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]')
должен это сделать. Да, это отвратительно.
Вы также можете отфильтровывать файлы после выбора всех из них
foreach(glob('my/dir/*') as $file){ $ext = strtolower(pathinfo($file, PATHINFO_EXTENSION)); if(!in_array($ext, array('csv'))){ continue; } ... do stuff ... }
производительность может быть не лучшим вариантом, если, например, у вас есть 1 миллион файлов, которые не являются csv в папке.
Вы можете написать свой собственный регистр, нечувствительный к регистру. Это из личной веб-библиотеки, которую я пишу:
/** 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));