我想要获取一个目录下的所有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
更慢或占用更多内存吗? - tjespeglob('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 ...
}
就性能而言,如果您的文件夹中有100万个不是csv格式的文件,则这可能不是最佳选项。
$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);
来到这个链接是为了使用多个文件的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);
$i
为什么是 '0'
? - alex我听说有一个函数可以这样使用: 试试看,看看是否适用于你!
<?php
$pattern = sql_regcase("*.txt");
glob($pattern);
?>
补充Ignacio的答案,如果你想使用一个不区分大小写的变量,可以通过将变量拆分为字节并自动准备字符范围来实现:
$dir = "my/dir/*";
$var = ".cSv"; // example
$var_array = str_split($var); // split into bytes
$case_insensitive_var = '';
foreach($var_array as $var_byte){
$case_insensitive_var .= '['.strtolower($var_byte).strtoupper($var_byte).']';
}
$dirs = glob($dir.$case_insensitive_var, GLOB_BRACE);
只需更改$dir和$var,即可准备就绪。
/** 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);
}
在Alex的提示基础上,这可能会有所帮助:
function glob_files ($d, $e)
{
$files = preg_grep ("/$e\$/i", glob ("$d/*"));
sort ($files)
return $files;
}
$d
是目录,$e
是扩展名。
glob()
在 Windows(以及可能的其他不区分大小写的文件系统)中实际上是不区分大小写的。 - Simon Eastglob("*.CSV")
只会找到大写文件,而glob("*.csv")
只会找到小写文件。--- 在 Windows7 上测试过,使用的是 PHP 5.3.8。 - Radon8472