无法让 glob 找到所有不以 ~ 开头的文件
Can't get glob to find all files not starting with ~
我编写了以下函数来递归查找所有不以 ~ 开头的文件。但它不起作用。事实上,它似乎只能找到以 ~
开头的那些
function rfl($dir) {
$search=$dir."[^~]*";
echo "searching for: $search<br/>";
$search=glob($search); //find every file and directory not starting with ~. directories are returned with / afterwards
$list=array();
foreach ($search as $file) {
if (is_dir($file)) {
$list=array_merge($list,rfl($file.'/')); //recursively search for valid files in directories
echo 'D: ' . $file.'<br/>';
} else {
$list[]=$file; //add files to list
echo 'F: ' . $file.'<br/>';
}
}
return $list;
}
print_r(rfl('code/'));
returns
searching for: code/[^~]*
searching for: code/~private/[^~]*
D: code/~private
Array ( )
这里是使用 Clayton 的答案的固定函数:
function rfl($dir) {
$search = preg_grep('!^'.$dir.'[^~]!', glob($dir.'*')); //find every file and directory not starting with ~. directories are returned with / afterwards
$list=array();
foreach ($search as $file) {
if (is_dir($file)) {
$list=array_merge($list,rfl($file.'/')); //recursively search for valid files in directories
} else {
$list[]=$file; //add files to list
}
}
return $list;
}
glob
似乎并没有真正允许否定,尽管其中一条评论在 PHP 的 glob 文档中说了什么。
相反,我建议将以下内容作为替代方案:
$path = '../Sites/';
$results = preg_grep('!^'.preg_quote($path).'[^~]!', glob($path.'*'));
print_r($results);
preg_grep 将过滤数组以仅允许不以波浪号开头的结果。由于 glob returns 是完整路径,我们需要转义并将路径包含在正则表达式模式中。
在此处阅读更多内容:http://php.net/preg_grep
preg_grep — Return array entries that match the pattern
Usage: array preg_grep ( string $pattern , array $input [, int $flags = 0 ] )
您的代码已更新以包含更改:
function rfl($dir) {
$search=$dir."[^~]*";
echo "searching for: $search<br/>";
$search= preg_grep('!^'.preg_quote($dir).'[^~]!', glob($dir.'*')); //find every file and directory not starting with ~. directories are returned with / afterwards
$list=array();
foreach ($search as $file) {
if (is_dir($file)) {
$list=array_merge($list,rfl($file.'/')); //recursively search for valid files in directories
echo 'D: ' . $file.'<br/>';
} else {
$list[]=$file; //add files to list
echo 'F: ' . $file.'<br/>';
}
}
return $list;
}
print_r(rfl('code/'));
所有不以 ~:
开头的文件
$files = glob('./files/[!~]*.*');
jpg 和 png,不以 ~:
开头
$files = glob('./files/[!~]*.{jpg,png}', GLOB_BRACE);
你会在这里找到详细的解释
https://cowburn.info/2010/04/30/glob-patterns/
我编写了以下函数来递归查找所有不以 ~ 开头的文件。但它不起作用。事实上,它似乎只能找到以 ~
开头的那些function rfl($dir) {
$search=$dir."[^~]*";
echo "searching for: $search<br/>";
$search=glob($search); //find every file and directory not starting with ~. directories are returned with / afterwards
$list=array();
foreach ($search as $file) {
if (is_dir($file)) {
$list=array_merge($list,rfl($file.'/')); //recursively search for valid files in directories
echo 'D: ' . $file.'<br/>';
} else {
$list[]=$file; //add files to list
echo 'F: ' . $file.'<br/>';
}
}
return $list;
}
print_r(rfl('code/'));
returns
searching for: code/[^~]*
searching for: code/~private/[^~]*
D: code/~private
Array ( )
这里是使用 Clayton 的答案的固定函数:
function rfl($dir) {
$search = preg_grep('!^'.$dir.'[^~]!', glob($dir.'*')); //find every file and directory not starting with ~. directories are returned with / afterwards
$list=array();
foreach ($search as $file) {
if (is_dir($file)) {
$list=array_merge($list,rfl($file.'/')); //recursively search for valid files in directories
} else {
$list[]=$file; //add files to list
}
}
return $list;
}
glob
似乎并没有真正允许否定,尽管其中一条评论在 PHP 的 glob 文档中说了什么。
相反,我建议将以下内容作为替代方案:
$path = '../Sites/';
$results = preg_grep('!^'.preg_quote($path).'[^~]!', glob($path.'*'));
print_r($results);
preg_grep 将过滤数组以仅允许不以波浪号开头的结果。由于 glob returns 是完整路径,我们需要转义并将路径包含在正则表达式模式中。
在此处阅读更多内容:http://php.net/preg_grep
preg_grep — Return array entries that match the pattern
Usage: array preg_grep ( string $pattern , array $input [, int $flags = 0 ] )
您的代码已更新以包含更改:
function rfl($dir) {
$search=$dir."[^~]*";
echo "searching for: $search<br/>";
$search= preg_grep('!^'.preg_quote($dir).'[^~]!', glob($dir.'*')); //find every file and directory not starting with ~. directories are returned with / afterwards
$list=array();
foreach ($search as $file) {
if (is_dir($file)) {
$list=array_merge($list,rfl($file.'/')); //recursively search for valid files in directories
echo 'D: ' . $file.'<br/>';
} else {
$list[]=$file; //add files to list
echo 'F: ' . $file.'<br/>';
}
}
return $list;
}
print_r(rfl('code/'));
所有不以 ~:
开头的文件$files = glob('./files/[!~]*.*');
jpg 和 png,不以 ~:
开头$files = glob('./files/[!~]*.{jpg,png}', GLOB_BRACE);
你会在这里找到详细的解释 https://cowburn.info/2010/04/30/glob-patterns/