Php 如何在文件名中检测公共字符串组
我一直在想办法检测一系列文件。例如: 如果给定目录包含以下文件:Php 如何在文件名中检测公共字符串组,php,regex,Php,Regex,我一直在想办法检测一系列文件。例如: 如果给定目录包含以下文件: 生日001.jpg 生日002.jpg 生日003.jpg Picknic1.jpg Picknic2.jpg 午后.jpg 我想把清单浓缩成 生日(3张照片) 皮克尼克(2张图片) 下午(1张图片) 我应该如何检测这些组?这里有一种方法可以解决这个问题,它比暴力方法更有效 将所有名称加载到一个关联数组中,其中键与名称相等,值与名称相等,但去掉了数字(preg\u replace('/\d//g',$key)) 您将有
- 生日001.jpg
- 生日002.jpg
- 生日003.jpg
- Picknic1.jpg
- Picknic2.jpg
- 午后.jpg
- 生日(3张照片)
- 皮克尼克(2张图片)
- 下午(1张图片)
我应该如何检测这些组?这里有一种方法可以解决这个问题,它比暴力方法更有效
- 将所有名称加载到一个关联数组中,其中键与名称相等,值与名称相等,但去掉了数字(
)preg\u replace('/\d//g',$key)
$arr1=[Birthday001=>Birthday002=>Birthday…]
- 现在创建另一个关联数组,其中的键是来自第一个数组的值,值是计数。当您已经看到密钥时,增加计数
- 最后,您将得到一个包含名称和计数的第二个数组,正如您所希望的那样。类似于
$arr2=[生日=>2,…]
<?php
# input
$filenames = array("Birthday001.jpg", "Birthday002.jpg", "Birthday003.jpg", "Picknic1.jpg", "Picknic2.jpg", "Afternoon.jpg");
# create histogram
$histogram = array();
foreach ($filenames as $filename) {
$name = preg_replace('/\d+\.[^.]*$/', '', $filename);
if (isset($histogram[$name])) {
$histogram[$name]++;
} else {
$histogram[$name] = 1;
}
}
# output
foreach ($histogram as $name => $count) {
if ($count == 1) {
echo "$name ($count picture)\n";
} else {
echo "$name ($count pictures)\n";
}
}
?>
生成一个单词数组,如“my”(开发此数组将非常重要,“my”是您给出的示例中唯一的一个),并从所有文件名中删除这些单词。去掉所有的数字和标点符号,扩展也应该早就消失了。完成后,将所有唯一结果放入一个数组中。然后,您可以使用它作为一个相当可靠的关键字来源来搜索其他处理未捕获的任何掉队者。我认为这是一个很好的问题,除非唯一的算法本质上是暴力。如果您假设所有语义标记在数字被剥离后都是相等的,那么这将起作用。这不会涉及像“MyBirthday001.jpg”和“MyBirthday002.jpg”这样的项目,但这是一个很好的起点。我完全同意。然而,这个问题并不是这样提出的,无论是谁编辑了它,把我的生日和生日001、生日002组合在一起,都大大改变了这个问题。OP可能真的想把它分成两个不同的组。是的,这正是我想要的。我主要关心的是匹配前缀字符串。这是一个很好的起点。谢谢。我回滚了该编辑,添加了“我的生日”条目——这太离谱了。要处理像“我的生日”这样的事情,您可以尝试使用levenshtein
函数计算代币之间的距离,并自动将距离小于预设阈值的代币分组。这与我的版本几乎完全相同,除代码外。注意:此答案基于问题的修订版本,该版本已被回滚。该版本包括一个名为“My birth.jpg”的文件,该文件应该与其他“birth”文件分组。