PHP递归扫描目录查找指定扩展名文件:RegexIterator结果不符求助
问题排查与解决
嗨,我来帮你搞定这个问题~你当前的代码得到的是RegexIterator对象而非预期的文件名数组,核心原因有两个:
1. 直接输出迭代器对象而非遍历结果
你代码里的$files是RegexIterator类的实例,它本质是一个可遍历的迭代器对象,不是现成的数组。直接用var_dump($files)只会输出对象的内部属性,而不是它包含的文件列表。
2. GET_MATCH标记的行为不符合预期
你使用了RecursiveRegexIterator::GET_MATCH标记,这个标记会让迭代器返回正则匹配的分组数组(比如每个元素是[0 => '完整文件路径', 1 => '匹配的扩展名']),而非你想要的文件名/路径本身。
修正后的代码方案
这里给你两种可行的修正方式,按需选择:
方案一:遍历迭代器提取文件路径(推荐)
这种方式更灵活,还能跳过无用的.和..目录:
$directory = './你的目标目录'; // 跳过.和..目录,避免无效遍历 $dirIterator = new RecursiveDirectoryIterator( $directory, RecursiveDirectoryIterator::SKIP_DOTS ); $recursiveIterator = new RecursiveIteratorIterator($dirIterator); // 使用默认的MATCH模式,匹配指定扩展名的文件 $regexIterator = new RegexIterator( $recursiveIterator, '/\.(src|in|out|rc)$/i' ); // 遍历迭代器,提取每个文件的完整路径 $fileList = []; foreach ($regexIterator as $fileInfo) { // $fileInfo是SplFileInfo对象,getPathname()返回完整文件路径 $fileList[] = $fileInfo->getPathname(); } var_dump($fileList);
方案二:转换为数组并处理(简化版)
如果想快速得到数组,可以用iterator_to_array转换后提取路径:
$directory = './你的目标目录'; $dir = new RecursiveDirectoryIterator($directory, RecursiveDirectoryIterator::SKIP_DOTS); $iter = new RecursiveIteratorIterator($dir); $files = new RegexIterator($iter, '/\.(src|in|out|rc)$/i'); // 转换为数组,false避免键名冲突 $fileInfos = iterator_to_array($files, false); // 提取每个文件的完整路径 $filePaths = array_map(function($info) { return $info->getPathname(); }, $fileInfos); var_dump($filePaths);
额外说明
- 若只需要文件名(不带路径),可以把
getPathname()换成getFilename()。 GET_MATCH标记适合需要提取正则分组内容的场景(比如单独获取扩展名),但这里你只需要文件路径,所以用默认的MATCH模式就足够了。
内容的提问来源于stack exchange,提问作者Brykyz
相关产品推荐
相关产品推荐

