使用不区分大小写(类似glob)的模式取消链接文件

时间:2012-03-13 13:11:04

标签: php directory glob

我有两个文件夹,其中一个是视频,第二个是每个视频的配置文件(每个视频3个文件)。现在,如果我要删除视频,我必须手动删除文件。 我发现了这个:

<?php

$filename = 'name.of.the.video.xml';       
$term = str_replace(".xml","", $filename);
$dirPath = ("D:/test/");

foreach (glob($dirPath.$term.".*") as $removeFile)
{
    unlink ($removeFile);
}

?>

回声将返回:

d:/test/name.of.the.video.jpg

d:/test/name.of.the.video.srt

d:/test/name.of.the.video.xml

没关系,这对我很有帮助,但我在这里遇到了问题。

并非所有文件都是相同的ex: Name.of.The.video.jpg Name.Of.The.Video.xml

如果我回显查找该字符串的文件夹并且不符合$ filename将返回空。 所以,我的问题是,我怎样才能使搜索Case不敏感? 谢谢。

2 个答案:

答案 0 :(得分:2)

您正在使用区分大小写的glob函数。因此,您使用了错误的函数来获取文件列表。

因此,您应首先规范化目录中的文件名,以便它们共享相同的大小写(例如全小写)。或者您需要使用另一种方法来使目录列表不区分大小写。我建议第一个,但是如果这不是一个选项,为什么不首先glob所有文件,然后使用preg_grep过滤文件列表,这允许指定不区分大小写的模式?

这使我认为将DirectoryIteratorRegexIterator一起使用更为切实可行:

$filename = 'name.of.the.video.xml';
$term = basename($filename, ".xml");
$files = new DirectoryIterator($dirPath);
$filesFiltered = new RegexIterator($files, sprintf('(^%s\\..*$)i', preg_quote($term)));
foreach($filesFiltered as $file)
{
    printf("delete: %s\n", $file);
    unlink($file->getPathname());
}

Iterator代码灵活性的一个很好的例子就是你改变了的要求:一次为两个目录做这个。您只需创建两个DirectoryIterator,然后使用AppendIterator将其附加到另一个... $files = new AppendIterator(); $files->append(new DirectoryIterator($dirPath1)); $files->append(new DirectoryIterator($dirPath2)); ... 。任务完成。其余代码保持不变:

glob

VOILÀ。听起来不错? {{1}}对于一些需要它的快速工作是可以的。对于目录操作的其他一切,开始考虑SPL。它拥有更多的力量。

答案 1 :(得分:1)

strcasecmp()是一个有效的函数吗?它是一个不区分大小写的str比较函数?

当然,如果您知道文件名并且可以将其回显,您可以将其传递给unlink()?