通过php.net手册中的注释给出一个给定的例子,我试图在递归目录结构中获取名为file.txt的每个文件。
Folder/
subfold1
subfold2
file.txt
subfold3
file.txt
等。是一个关于文件夹结构可能如何的示例。
$directory = new \RecursiveDirectoryIterator(__DIR__ . '/..');
$iterator = new \RecursiveIteratorIterator($directory);
$files = new \RegexIterator($iterator, '/^file.txt$/', \RecursiveRegexIterator::GET_MATCH);
var_dump($files);
问题是给定的代码给出了以下结果:
object(RegexIterator)#4 (1) { ["replacement"]=> NULL }
我该怎么办?我只是在寻找文件和给定的路径,最好是在数组中。
答案 0 :(得分:3)
您通常希望迭代而不是*Iterator
个对象,通常使用基本的foreach()
循环。
foreach ($files as $file) {
// Do something
}
在您的情况下,工作是 little 更多涉及,因为您当前使用的代码将永远不会返回任何匹配的文件进行迭代。首先,让我们看看应该有什么用。
$directory = new RecursiveDirectoryIterator(
__DIR__ . '/..',
RecursiveDirectoryIterator::KEY_AS_FILENAME |
RecursiveDirectoryIterator::CURRENT_AS_FILEINFO
);
$files = new RegexIterator(
new RecursiveIteratorIterator($directory),
'#^file\.txt$#',
RegexIterator::MATCH,
RegexIterator::USE_KEY
);
关键的改变主要是:
RecursiveDirectoryIterator::KEY_AS_FILENAME
的{{1}}标记,与RecursiveDirectoryIterator
标志以前,当迭代器被迭代时,正则表达式将匹配“当前”迭代器值,在您的情况下,该值是表示每个文件的RegexIterator::USE_KEY
对象。当转换为字符串时,为了使正则表达式进行匹配,SplFileInfo
对象被转换为完整路径;目录和所有。这意味着你的正则表达式永远不会匹配,因为它只是期望文件名。
简而言之,SplFileInfo
和KEY_AS_FILENAME
标志意味着正则表达式只处理每个文件的文件名。耶!
您可能还注意到我在USE_KEY
模式下使用了RegexIterator
。这意味着在循环匹配的文件时,我们可以完全访问每个RegexIterator::MATCH
对象。这给了我们更多的东西,而不仅仅是一个文件名为SplFileInfo
的字符串。
要打印出每个文件及其完整路径,您可以使用以下内容:
RegexIterator::GET_MATCH
有关可用方法的完整列表,请参阅SplFileInfo
documentation。