RegEx在同一个正则表达式中包含一个字符串但不包含其他字符串

时间:2012-09-24 06:02:27

标签: php regex

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

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

现在$file_list包含所有扩展名为.php的文件。但是我希望能够获得所有php文件,但跳过文件夹名称查看,但我不知道如何编写这样的正则表达式,因为我不擅长它。

我只想获取所有.php个文件,但不是来自名为视图的文件夹。


更新

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

在这里,我只想从返回的文件/文件夹名称中删除一个名为 views 的文件夹,如果上面的正则表达式可以修改以便考虑到这一点,我很乐意。

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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