stripos vs glob取消链接

时间:2018-10-03 07:54:35

标签: php arrays glob unlink

我要删除未出现在此数组中的文件。我部分地知道文件名,但是不知道文件名后跟filename-50x75.jpg, filename-100x77.jpg , filename-500x377.jpg后缀的size参数。

我想从目录中删除上方的图像,并且不想删除下方的图像。

$list_of_allowed_images=array("filename-50x50.jpg","filename-50x70.jpg","filename-90x50.jpg","filename-100x100.jpg","filename-150x150.jpg","filename-250x200.jpg","filename-300x250.jpg","filename-360x270.jpg","filename-390x250.jpg","filename-500x345.jpg","filename-768x576.jpg","filename-820x400.jpg","filename-1024x768.jpg");

我有以下代码段:

foreach(glob($base_path_del.$only_obs_img."[0-9][0-9]*x*.{jpg,gif,png}", GLOB_BRACE) as $file_to_del_now)
{ 
  if(!in_array($file_to_del_now,$list_of_allowed_images))
  {
    unlink($file_to_del_now);       

   }            
} 

但是我认为它可以更有效率。还有另一种更有效的方法吗?

1 个答案:

答案 0 :(得分:0)

这是我推荐的:

(未经测试的代码)

chdir($base_path_del);
$files = glob($only_obs_img."[0-9][0-9]*x*.{jpg,gif,png}", GLOB_BRACE);
$whitelist_regex = "/-(?:50x[57]0|90x50|100x100|150x150|250x200|300x250|360x270|390x250|500x345|768x576|820x400|1024x768)\.jpg$/i";
$removables = preg_grep($whitelist_regex, $files, PREG_GREP_INVERT);
foreach ($removables as $filename) {
    unlink($filename);       
}

所以...

更改当前工作目录,以使glob()不包含合格文件集中的路径。

反转preg_grep(),以便保留与白名单正则表达式要求不符的文件。

然后循环调皮清单并删除批次。

正则表达式模式可以简化白名单数组逻辑。检查从文件名的最后-开始,检查尺寸,不区分大小写地检查.jpg,然后确保文件名已结束。

p.s。或array_map()(如果您不想破坏功能样式)。

array_map('unlink', $removables);