使用PHP在文件名中查找带有字符串或模式的目录中的所有文件

Posted

技术标签:

【中文标题】使用PHP在文件名中查找带有字符串或模式的目录中的所有文件【英文标题】:Find all files in directory with string or pattern in filename with PHP 【发布时间】:2011-06-10 17:49:01 【问题描述】:

我正在尝试使用 php 列出目录(递归或非递归)中文件名与特定模式匹配的文件。我对正则表达式从来都不是太好,所以你能提供的任何帮助都会很棒。我可以搜索返回的文件名的文字检查,但我认为这不是一个好主意:)

更新 + 最终解决方案:1/18/2011 @ 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;
        
    

?>

我实际上并不需要递归,但是网上确实有很多递归示例,这确实是我最不担心的。按模式进行内容隔离是这个任务的核心,所以上面的代码就足够了。

旁注:

对于那些昨天指出“接受的 cmets”的人,我不知道我错过了这一点,我深表歉意。我今天过得很糟糕。对不起,如果我似乎对任何人对 cme​​ts 嗤之以鼻。这是一个很棒的社区,我也很乐意尽我所能回馈社会。

【问题讨论】:

我已经回答了一些问题,但它也说 6 个符合条件的问题中有 0 个得到了回答。我什至看不到它希望我回答的那 6 个领域。 当我看到一些我认为可以贡献的东西时,我会尝试为这个人回答或研究问题。 是的,我现在明白了。对不起,伙计们。 Help Using RegexIterator in PHP的可能重复 【参考方案1】:

使用glob to find pathnames matching a pattern 或GlobIterator

如果你需要递归use a RegexIterator and a RecursiveDirectoryIterator.

标记此 CW 是因为该问题肯定是重复的,并且您可以在使用搜索功能时轻松找到上述所有问题的示例。请这样做。

【讨论】:

我没有在搜索“RegexIterator”,因为我没有想到它。没有必要因为不搜索而打电话给我。这是我花时间写东西之前要做的第一件事。搜索速度更快。 感谢您指出这一点。很大的帮助和感谢:)

以上是关于使用PHP在文件名中查找带有字符串或模式的目录中的所有文件的主要内容,如果未能解决你的问题,请参考以下文章

linux如何查找以某个字母打头的文件或文件夹 比如,/etc目录下很多文件,我想列出所有以c开头的文件或文件

如何查找不包含给定字符串模式的文件?

用字符串中的任何字符查找任何数字和空格的匹配模式并替换为 |在 PHP [关闭]

递归查找文件中的文本 (PowerShell)

PHP读取目录下所有文件内容并显示

复制/etc/profile至/tmp/目录,用查找替换命令删除/tmp/profile文件中的 行首的空白字符及在vim中设置tab缩进为4个字符