0

所以我使用目录迭代器来获取所有这样的php文件:

$file_list = new RegexIterator($iterator_instance, '/^.+\.php$/');

现在$file_list包含所有具有.php扩展名的文件。但是,我希望能够获取所有 php 文件,但跳过带有名称视图的文件夹,但我不确定如何编写这样的正则表达式,因为我不擅长它。

我只想获取所有.php文件,而不是从名为views的文件夹中获取。


更新:

$dir_iterator = new RecursiveDirectoryIterator($path);
$iterator = new RecursiveIteratorIterator($dir_iterator);
$file_list = new RegexIterator($iterator, '/^.+\.php$/');
// foreach stuff now

在这里,我只想从返回的文件/文件夹名称中跳过名为views的文件夹,如果也可以修改上面的正则表达式来解决这个问题,我会很高兴。

4

2 回答 2

4

你可以使用CallbackFilterIterator(PHP 5.4)

// Assuming $file_list is based on a FilesystemIterator
$iter = new CallbackFilterIterator($file_list, function($current) {
    return strpos('/views/', $current->getReaPath()) === false;
});

对于 PHP 5.3:

class DirectoryFilter extends FilterIterator {
    public function accept() {
        $current = $this->getInnerIterator()->current();
        return strpos('/views/', $current->getReaPath()) === false;
    }
}
$iter = new DirectoryFilter($file_list);
于 2012-09-24T06:04:58.170 回答
3

您可以使用此正则表达式:

'%^(?!.*[\\\\/]views?[\\\\/]).+\.php$%'

解释:

^         # Start of string
(?!       # Assert that it's impossible to match the following here:
 .*       #  any number of characters
 [\\\\/]  #  a path delimiter (backslash or forward slash)
 views?   #  followed by view or views
 [\\\\/]  #  followed by a path delimiter
)         # End of lookahead assertion
.+        # Match one or more characters
\.php     # Match .php
$         # End of string
于 2012-09-24T06:13:46.523 回答