在 PHP 中过滤文件名

Filtering filenames in PHP

我正在尝试根据 RecipeID 和 StepID 将一堆文件组合在一起。我没有将所有文件名存储在 table 中,而是决定只使用 glob 来获取所请求食谱的图像。我觉得这样会更高效,处理的数据更少。请记住,该目录最终将包含数千张图像。如果我错了,那么下面的问题就没有必要了 lol

假设我有 RecipeID #5(玉米片,mmmm),它有 3 个准备步骤。我决定的命名约定是这样的:

5_1_getchips.jpg
5_2_laycheese.jpg
5_2_laytomatos.jpg
5_2_laysalsa.jpg
5_3_bake.jpg
5_finishednachos.jpg
5_morefinishedproduct.jpg

这些文件可能是由相机生成的,所以 DSC###.jpg...或者这个人可能实际上已经按照我上面的方式命名了每张图片。每个步骤可以存在多个图像。我不确定我将如何处理欺骗文件名,但我觉得这超出了范围。

我想获取所有“5_”图像...但是通过所有没有任何步骤 # 的图像(分组为一个 DIV)过滤它们,然后获取所有确实有一个步骤(分组在各自的 DIV 中)。

我在想

foreach ( glob( $IMAGES_RECIPE .  $RecipeID . "-*.*") as $image)

然后使用 substr 过滤掉步骤#,但我担心逻辑是否正确,因为如果原始文件名已经有 _#_ 出于某种原因。也许我需要有一个严格的命名约定,如果它不属于某个步骤,则始终包含 _0_

想法?

遍历 1000 多个文件绝不会比在数据库(任何类型)中为这些文件建立索引并为它们执行数据库查询更快。这就是数据库的意义所在。

我遇到了 15,000 首 mp3 歌曲的类似问题。

在Win命令行目录

dir *.mp3 /b /s > mp3.bat

在 NotePad++ 中使用正则表达式搜索和替换,转换文件名并添加前缀和附加文本创建重命名语句,运行 mp3.bat.


在 PHP:

中,类似的内容可能对您有用
  1. 使用正则表达式提取使用 preg_replace 到
  2. 的数字
  3. 创建逻辑 table(s) 来为新文件名创建单词
  4. 使用 rename() 创建新文件名

这里有一些简化的、未经测试的示例代码来展示我的建议。

示例逻辑Table:

 $translation[x][y][z] = "phrase";
 $translation[x][y][z] = "phrase";
 $translation[x][y][z] = "phrase";
 $translation[x][y][z] = "phrase";

  $folder = '/home/user/public_html/recipies/';
  $dir=opendir($folder);
  while (false !== ($found=readdir($dir))){
    if pathinfo($file,PATHINFO_EXTENSION) == '.jpg')
     { 
       $files[]= pathinfo($file,PATHINFO_FILENAME);
     }
  }
  foreach($files as $key=> $filename){
    $digit1 = 'DSC(\d)\d\d\.jpg/',"", $filename);
    $digit2 = 'DSC\d(\d)\d\.jpg',"", $filename);
    $digit3 = 'DSC\d\d(\d)\.jpg',"", $filename);
    $newName = $translation[$digit1][$digit2][$digit3]
    ren($filename,$newfilename);
  }