用 PHP 筛选特定扩展名的文件从目录中获取的最佳方法

49

5
有大约十几个问题是在问同样的事情。【在提问前请先做好调研。】(http://stackoverflow.com/questions/ask-advice) - Gordon
使用 scandir - Korvin Szanto
1
//需要扫描的目录路径 $directory = "../file/";//获取所有扩展名为.text的图像文件。 $images = glob($directory . "*.text ");//打印每个文件名 foreach($images as $image) { echo $image; } - Database_Query
2
我认为globscandir更好。 - Francois Deschenes
3
glob("*.txt"):http://us3.php.net/manual/en/function.glob.php - Michael Berkowski
7个回答

114

PHP有一个非常好的函数可以帮助您仅捕获需要的文件。它被称为glob()

glob - 查找与模式匹配的路径名

返回包含匹配的文件/目录的数组,如果没有文件匹配,则返回空数组或者在错误时返回FALSE。

以下是一个示例用法 -

$files = glob("/path/to/folder/*.txt");

这将使用给定路径中匹配*.txt模式的所有文件填充$files变量。

参考文献 -


4
请勿回答明显的重复问题,而应该投票将其标记为关闭。谢谢。 - Gordon
5
@gor - 需要比我投票关闭更多的支持才能将此问题标记为重复。请等待其他用户参与并提供他们的意见。 - Lix
1
@Lix为什么不直接使用$files = glob("/path/to/folder/*.txt")而不需要使用for循环呢?我认为这是一样的。 - Mohamad Osama
@MohamadOsama - 你说得完全正确 :) 回顾8年前的旧代码总是很有趣哈哈!感谢您的反馈! - Lix
2
@Lix - 是的,这是非常老的代码,但现在它们帮助我解决了问题。欢迎你,兄弟。 - Mohamad Osama

22
如果您想搜索一个以上的扩展名,则preg_grep()是过滤的替代方法:
 $files = preg_grep('~\.(jpeg|jpg|png)$~', scandir($dir_f));

glob虽然有类似的额外语法,但这种语法更多地是在您需要进一步条件、添加~i标志以进行不区分大小写筛选或可以筛选组合列表的情况下使用。


6
glob("{$dir}*.{jpg,jpeg,gif,ico,png}", GLOB_BRACE)。这也适用于多个扩展名。 - Savas Vedova
1
这个答案对我非常有帮助!我试图在包含数以万计文件的文件夹中搜索数百个不同的文件标识符和文件。glob无法处理如此大的搜索字符串,如果我将其分成较小的字符串并循环,需要几分钟的时间。使用preg_grep和scandir大约需要5秒钟! - William W
感谢您向我介绍 preg_grep。与 glob 相比,它更加有用,可以处理大小写不敏感的情况。 - Juergen Schulze
这适用于路径中的方括号,而使用glob()的方括号必须进行转义。 - Dmytro Dzyubak

9

PHP的glob()函数可以让你指定一个搜索模式。


6
您可以尝试使用GlobIterator
$iterator = new \GlobIterator(__DIR__ . '/*.txt', FilesystemIterator::KEY_AS_FILENAME);
$array = iterator_to_array($iterator);
var_dump($array);

2

glob($pattern, $flags)

<?php
foreach (glob("*.txt") as $filename) {
    echo "$filename size " . filesize($filename) . "\n";
}
?>

2

试试这个

//path to directory to scan
$directory = "../file/";

//get all image files with a .txt extension.
$file= glob($directory . "*.txt ");

//print each file name
foreach($file as $filew)
{
echo $filew;
$files[] = $filew; // to create the array

}

我不知道任何带有 .text 扩展名的文件。 - Madara's Ghost
1
@MadaraUchiha 抱歉,这是一个打字错误。 - Database_Query
可能会有任何扩展名的文件。 - Pablo Pazos

2

我还没有测试过这个正则表达式,但应该是类似这样的:

if ($handle = opendir('/file/path')) {

    while (false !== ($entry = readdir($handle))) {
        if (preg_match('/\.txt$/', $entry)) {
            echo "$entry\n";
        }
    }

    closedir($handle);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接