在 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:
中,类似的内容可能对您有用
- 使用正则表达式提取使用 preg_replace 到
的数字
- 创建逻辑 table(s) 来为新文件名创建单词
- 使用 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);
}
我正在尝试根据 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:
中,类似的内容可能对您有用- 使用正则表达式提取使用 preg_replace 到 的数字
- 创建逻辑 table(s) 来为新文件名创建单词
- 使用 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);
}