PHP - 按模式获取目录中的所有文件名


PHP - get all filenames in dir by pattern

我发现这段代码可以循环访问文件夹中的文件:

if (is_dir($dir)) {
  if ($dh = opendir($dir)) {
    while (($file = readdir($dh)) !== false) {
          ???????????
  }
    closedir($dh);
}

文件的名称如下:project-1-0, project-1-1, project-5-14, project-6-21 ...现在我需要过滤所有文件,只获取以"project-1-??开头的文件我该怎么做,我应该使用blob()函数吗?有没有简单的例子?我正在使用 laravel,所以也许其中有一个功能,但我找不到有用的东西

glob正是

你想要的。但是,由于您似乎正在使用Laravel(由于标签),您应该查看Laravel的FileSystem类(使用File外观访问):4.2文档。它为标准PHP文件函数提供了一个包装器(尽管实际上并没有为您的目的添加任何内容)。

你可以做这样的事情:

if (File::isDirectory($dir)) {
    foreach (File::glob($dir.'/project-1-*') as $projectDir) {
        $actualDir = substr($projectDir, strlen($dir) + 1); // trim the base directory
    }
}

但是如果你想要一个更强大的文件查找系统,你可以使用Symfony的Finder组件(docs),如果你使用Laravel(就像一些Laravel Filesystem方法使用它一样),它已经包含在你的项目中,你将能够做这样的事情:

$dirs = Finder::create()->in($dir)->depth(0)->directories()->name('project-1-*');
// or, if you want to use regex, this should work
$dirs = Finder::create()->in($dir)->depth(0)->directories()->name('/^project-1-/');

现在,Finder 返回了一个迭代器,因此如果您需要将其用作数组,您可以使用 PHP 的 iterator_to_array 函数将其转换为数组(也就是说,如果您不需要它作为数组,迭代器会更好,例如foreach它)。