代码之家  ›  专栏  ›  技术社区  ›  Steeve

stripos与glob解除链接

  •  1
  • Steeve  · 技术社区  · 7 年前

    我要删除不在此数组中显示的文件。我只知道文件名的一部分,但不知道文件名后面的大小参数,比如 filename-50x75.jpg, filename-100x77.jpg , filename-500x377.jpg .

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

    $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 回复  |  直到 7 年前
        1
  •  0
  •   mickmackusa Tom Green    7 年前

    以下是我的建议:

    (未经测试的代码)

    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() 这样就可以保留不符合白名单regex要求的文件。

    然后循环调皮的名单,删除该地段。

    regex模式将您的白名单数组逻辑分解。支票最后开始 - 在文件名中,检查尺寸,检查 .jpg 不区分大小写,然后确保文件名已结束。

    P.S.或 array_map() 如果你不想打破功能风格。

    array_map('unlink', $removables);