在我的recurive函数中压缩整个文件夹我有这段代码glob($ path.'/*')给我所有文件和子文件夹匹配我的$ path.
在这里我用glob读到了我甚至可以得到隐藏文件".filename"with glob('{,.}*',GLOB_BRACE)如何合并我需要的一个表达式?我尝试了glob('{/,.}'',GLOB_BRACE),但只给了我试过的文件glob('{/,.,}}',GLOB_BRACE但是我得到了疯狂的结果
我已经过滤了.和..
如何合并
glob($dir . '/*')
Run Code Online (Sandbox Code Playgroud)
和
glob('{,.}*', GLOB_BRACE)
Run Code Online (Sandbox Code Playgroud)
Hou*_*mam 10
要获取所有文件夹/文件(甚至是隐藏的文件夹/文件):
$result = glob($path . '{,.}[!.,!..]*',GLOB_MARK|GLOB_BRACE);
Run Code Online (Sandbox Code Playgroud)
这将阻止列出"." 或结果中的"..".
我在这里回答以防其他人正在寻找,因为这在 Google 上看起来很高。
解决方案 1 - 仅 glob
这使用了一个专为跳过 '.' 而设计的 glob。和 '..' 特殊目录。它匹配以下任何内容:
$globbed = glob("{*,.[!.]*,..?*}", GLOB_BRACE);
var_dump($globbed);
Run Code Online (Sandbox Code Playgroud)
解决方案 2 - globignore
这是一个在 bash 中模仿globignore行为的函数。
function globignore(array $ignore, $glob, $glob_flags = 0)
{
$globbed = glob($glob, $glob_flags);
return array_filter($globbed, function ($f) use ($ignore)
{
$base = basename($f);
foreach($ignore as $i)
{
if ($i == $base) return false;
}
return true;
});
}
$globbed = globignore(['.','..'], "{*,.*}", GLOB_BRACE);
var_dump($globbed);
Run Code Online (Sandbox Code Playgroud)
它们似乎在我的系统上几乎完全相同的时间执行。解决方案 1需要较少的代码,但解决方案 2更容易包含更多要忽略的术语。
这将返回隐藏的文件和文件夹,但不返回.或..:
glob('{,.}*[!.]*', GLOB_MARK | GLOB_BRACE);
Run Code Online (Sandbox Code Playgroud)
结果示例:
file
file.
file.ext
folder/
...hiddenfile
...hiddenfile.ext
..hiddenfolder/
.h
.hiddenfile
.hiddenfolder/
Run Code Online (Sandbox Code Playgroud)
附加信息
Houman 尝试以.或.. with为目标[!.,!..],但由于这是一个字符类,因此不可能以定义的长度为目标。这意味着[!.]和[!..]是相同的,并且目标两个字符串不包含无限数量的点(., .., ..., .... 等)。正因为如此,我才使用[!.]。只能使用像{jpg,png}. 您可以在 php.net 评论中找到很好的解释。
尽管我使用该标志GLOB_MARK为文件夹添加了结束斜杠。
该glob()方法返回一个数组。所以如果你想合并两个不同的glob结果......
$merged = array_merge(glob($dir . '/*'), glob('{,.}*', GLOB_BRACE));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5992 次 |
| 最近记录: |