2012-09-24 42 views
0

所以我使用的目录迭代器来获取所有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 

在这里,我只是想从返回的文件/文件夹名称,一个名为意见应该被跳过,我也很喜欢,如果上述正则表达式可以修改为文件夹也说明了这一点。

回答

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 
+0

当我在我的问题中运行更新的代码时,它不起作用。我仍然在它下面得到views文件夹和文件。 – Dev555

+0

在你原来的问题中,你想跳过的文件夹被命名为'view',而不是'views'。如果你想要捕捉这两者,可以在lookahead断言中使用'/ views?/'。 –

+0

谢谢,但它返回视图文件夹。一个例子:'admin \ views \ includes \ footer.php'。我想要所有的PHP文件,但不是从实际上我想要的视图文件夹。 – Dev555

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); 
+0

这不是我的问题!我知道。它是关于正则表达式和跳过文件夹命名**视图**而使用'RegexIterator'例如正则表达式 – Dev555

+0

@ Dev555我确实错误地读你的问题。我已经更新了我的答案。 – Petah

+0

感谢您的回答我最好寻找正则表达式解决方案。 +1虽然。 – Dev555

相关问题