您在代码中混淆了fnmatch和正则表达式.要获取除特殊文件和目录之外的所有文件和目录,请使用:
$dir_array = array_diff($dir_array, array(".", ".."));
或者,如果你仍然迭代数组,你可以像这样测试每个元素:
foreach ($dir_array as $name) { if (($name != "..") && ($name != ".")) { // Do stuff on all files and directories except . .. if (is_dir($name)) { // Do stuff on directories only } } }
在php <5.3中,您也可以专门使用回调函数:
$dir_array = array_filter($dir_array, create_function('$n', 'return $n != "." && $n != ".." && is_dir($n);'));
(有关更详细的版本,请参阅Allain Lalonde的答案)
从php 5.3开始,这可以写得更好:
$dir_array = array_filter($dir_array, function($n) {return $n != "." && $n != ".." && is_dir($n);});
最后,结合array_filter和这个答案的第一行代码会产生一个(微不足道)较慢但可能更易读的版本:
$dir_array = array_filter(array_diff($dir_array, array(".", "..")), is_dir);