使用PHP查找目录中所有文件名包含特定字符串或模式的文件

21
我试图用PHP列出目录中匹配特定模式的文件(递归或非递归)。我不太擅长正则表达式,如果您能提供任何帮助,将不胜感激。我可以搜索文件名返回的文字意义检查,但我认为这不是一个好主意 :)
更新+最终解决方案:2011年1月18日@ 8:06 PM
我发现了另一种方法来完成我所要寻找的内容,一旦我更了解正则表达式。尽管我对正则表达式感到完全沮丧,但由于我的朋友抽空向我解释了其中一些内容比我在在线指南中找到的简单得多,我现在已经有一点点理解了。
这个解决方案基本上检查具有以“prefixone”或“prefixtwo”为前缀的特定图像,同时还验证它是否是特定类型的图像(jpg、jpeg、png)并匹配以下任何格式之一。
根据您从WordPress传递的slug(我正在使用此项功能),它将与该正则表达式匹配。以下是样例列表:
prefixone.123-abc._tag1.001.jpg
prefixone.345-xyz._tag1.002.jpeg
prefixtwo.123-abc._tag2._tag1.003.jpg
prefixone.123-abc._tag2.004.jpeg
prefixtwo.345-xyz._tag2._tag3._tag1.005.jpg
prefixtwo.123-abc._tag1.001.jpg
prefixone.345-xyz._tag1.001.png
prefixtwo.456-rst._tag1.001.png

我们的opendir()函数返回的文件列表中,所有这些可能与slug匹配的文件都可以是匹配项。不管文件名中标签信息的顺序如何。

希望这能帮助另一个正在苦苦挣扎的正则表达式用户。学习它确实很痛苦,但一旦你理解了一些基本的东西,其余的就会迅速落入到位,开始构建你自己的正则表达式。

代码:

<?php
// create an array to hold directory list
$results = array();

// create a handler for the directory
$directory = $_SERVER['DOCUMENT_ROOT'].'/some/path/to/images/';
$handler = opendir($directory);

// open directory and walk through the filenames
while ($file = readdir($handler)) {

    // if file isn't this directory or its parent, add it to the results
    if ($file != "." && $file != "..") {

        // check with regex that the file format is what we're expecting and not something else
        if(preg_match('#^(prefixone|prefixtwo)[^\s]*\.'.$wordpress-slug.'\.[^\s]+(\.(jpg|jpeg|png))#', $file)) {

            // add to our file array for later use
            $results[] = $file;
        }
    }
}
?>

实际上,我并不需要递归来完成这个任务,但在网上确实有很多递归的示例,而且那真的是我最不用担心的。根据模式进行内容隔离是这个任务的核心,因此上面的代码已经足够。

顺便说一句:

对于那些昨天指出“已接受的评论”的人,我不知道我错过了那件事,并为此道歉。我当时情绪很糟糕,如果我对评论发表了任何冲动的言论,请原谅。这是一个伟大的社区,我很高兴能够做出贡献。


我已经回答了一些问题,但它也显示有6个符合条件的问题没有被回答。我甚至不知道在哪里可以找到那6个问题需要回答。 - Will Ashworth
1
当我看到我认为自己可以为之做出贡献的事情时,我会尝试回答或为这个人研究解决问题。 - Will Ashworth
是的,我现在明白了。对不起,伙计们。 - Will Ashworth
可能是PHP中使用RegexIterator的帮助的重复问题。 - Gordon
1个回答

15

3
我没有搜索“RegexIterator”,因为我没有想到。不需要指责我没有搜索。在写东西之前,这是我做的第一件事。搜索更快。 - Will Ashworth
2
我很感激你指出这一点。非常有帮助,谢谢 :) - Will Ashworth

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