You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 05:52:50