如何在RecursiveDirectoryIterator中使用通配符*进行匹配?
问题描述
现有如下文件结构:
./files/ABC123/uriewo/bob/file1.txt ./files/ABC123/uriewo/bob/file2.txt ./files/ABC123/uriewo/John/file1.txt ./files/ABC123/t3t35/bob/file1.txt ./files/ABC123/urihfgewo/Terry/file1.txt
需要匹配./files/ABC123/*/bob/路径下的所有文件,但直接使用RecursiveDirectoryIterator传入带通配符的路径不可行,因为它不支持通配符匹配,请问该如何实现需求?
解决方案
方法一:通过GlobIterator定位目标目录后遍历
先利用通配符找到所有符合条件的bob目录,再逐个遍历这些目录下的文件:
// 获取所有符合路径规则的bob目录 $bobDirs = new GlobIterator('./files/ABC123/*/bob/', GlobIterator::CURRENT_AS_PATHNAME); foreach ($bobDirs as $dir) { // 遍历单个bob目录下的所有文件 $files = new RecursiveIteratorIterator( new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS), RecursiveIteratorIterator::CHILD_FIRST ); foreach ($files as $file) { if ($file->isFile()) { echo $file->getPathname() . PHP_EOL; } } }
方法二:用递归迭代器+回调过滤路径
先递归遍历ABC123根目录,再通过回调函数筛选出bob目录下的文件:
$filteredIterator = new RecursiveCallbackFilterIterator( new RecursiveDirectoryIterator('./files/ABC123/', RecursiveDirectoryIterator::SKIP_DOTS), function ($current, $key, $iterator) { // 允许遍历所有子目录,确保不会漏掉深层路径 if ($iterator->hasChildren()) { return true; } // 检查当前文件的路径是否包含/bob/,以此判断是否属于目标目录 return strpos($current->getPath(), '/bob/') !== false; } ); $files = new RecursiveIteratorIterator($filteredIterator, RecursiveIteratorIterator::CHILD_FIRST); foreach ($files as $file) { if ($file->isFile()) { echo $file->getPathname() . PHP_EOL; } }
方法三:直接用glob函数匹配(适合无深层子目录场景)
如果bob目录下没有嵌套子目录,直接用glob函数就能快速匹配目标文件:
$files = glob('./files/ABC123/*/bob/*'); foreach ($files as $file) { if (is_file($file)) { echo $file . PHP_EOL; } }
内容的提问来源于stack exchange,提问作者frumbert
相关产品推荐
相关产品推荐

