ディレクトリ内のすべてのCSVファイルが必要なので、
glob('my/dir/*.CSV')
ただし、これは小文字のCSV拡張子を持つファイルを検索しません。
使用できます
glob('my/dir/*.{CSV,csv}', GLOB_BRACE);
しかし、すべての混合ケースバージョンを許可する方法はありますか?それともこれは単なる制限glob()
ですか?
ディレクトリ内のすべてのCSVファイルが必要なので、
glob('my/dir/*.CSV')
ただし、これは小文字のCSV拡張子を持つファイルを検索しません。
使用できます
glob('my/dir/*.{CSV,csv}', GLOB_BRACE);
しかし、すべての混合ケースバージョンを許可する方法はありますか?それともこれは単なる制限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 ...
}
たとえば、フォルダにcsvではないファイルが100万個ある場合、パフォーマンスの面ではこれは最適なオプションではない可能性があります。
このコードは、画像のみを取得し、大文字と小文字を区別しないようにするために機能します。
画像リスト:
$imageOnly = '*.{[jJ][pP][gG],[jJ][pP][eE][gG],[pP][nN][gG],[gG][iI][fF]}';
$arr_files = (array) glob($path . $imageOnly, GLOB_BRACE);
見た目は醜いかもしれませんが、$ imageOnlyを宣言する必要があるのは1回だけで、必要な場所で使用できます。$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);
大文字と小文字を区別しない独自のグロブを作成できます。これは私が書いた個人のウェブライブラリからのものです:
/** 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);
?>
複数のファイルがある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);
Alexのヒントに基づいて、これは一般的に役立つ可能性があります。
function glob_files ($d, $e)
{
$files = preg_grep ("/$e\$/i", glob ("$d/*"));
sort ($files)
return $files;
}
ここ$d
で、はディレクトリで、$e
は拡張子です。
すべての拡張機能で機能させるには、次を使用します。
$extension = 'some_extension';
glob('my/dir/*.preg_replace('/(\w)/e', "'['.strtoupper($1).strtolower($1).']'", $extension));