PHP取消链接以通过正则表达式删除旧图像

时间:2017-01-12 15:57:55

标签: php regex preg-match glob unlink

我正在尝试创建一个php脚本,它将搜索我网站中的特定路径并删除一系列旧的和未使用过的图像。

它们可以以.jpg.jpeg.gif.png结尾,还有一些.webp附加到我刚才提到的那些上。

图像的格式通常以:-xxxx-xxxx-.extension结尾,例如:

  • 32x32.png.webp
  • 50x150.png
  • 720x1024.gif
  • 1920x1920.jpeg.webp

以下正则表达式可以正确地检测到它们:

  • ^(.+[0-9]+.[0-9]+\.(png|gif|jpe?g)\.?(webp)?)$

我尝试了以下内容,但由于某种原因,它没有做任何事情:

<?php
    $glob = glob('/home/HOSTACC/public_html/fx/upd/*');
    foreach($glob as $file) {
        if(preg_match('^(.+[0-9]+.[0-9]+\.(png|gif|jpe?g)\.?(webp)?)$', $file)) {
            unlink($file);
        }
    }
?>

我的目录/home/HOSTACC/public_html/fx/upd/包含多个包含图片的文件夹,下面是一些示例:

  • /home/HOSTACC/public_html/fx/upd/y-icon-sprite-213x300.png
  • /home/HOSTACC/public_html/fx/upd/01/desx-yopy-small-150x150.png
  • /home/HOSTACC/public_html/fx/upd/old/maximumload-web-1920x1920.png
  • /home/HOSTACC/public_html/fx/upd/old/maximumload-web-1920x1920.png.webp
  • /home/HOSTACC/public_html/fx/upd/ex/new/old-storage-720x500.png

递归:

<?php
    echo "<pre>";

    function rsearch($folder, $pattern_array) {
        $return = array();
        $iti = new RecursiveDirectoryIterator($folder);
        foreach(new RecursiveIteratorIterator($iti) as $file){
            if (in_array(strtolower(array_pop(explode('.', $file))), $pattern_array)){
                $return[] = $file;
            }
        }
        return $return;
    }
    $filepaths = rsearch('/home/HOSTACC/public_html/fx/upd/', array('jpeg', 'jpg', 'jpeg', 'png', 'gif', 'webp') );

    foreach($filepaths as $file) {
        /* The following line prints the correct paths*/
        $filename = $file->getFilename();
        $filepath = $file->__toString();
        $filenamenew = end((explode('/', $filepath)));
        echo var_dump($filename);
        echo var_dump($filenamenew);
        echo var_dump($filepath);
        if(preg_match('/^(.+[0-9]+.[0-9]+\.(png|gif|jpe?g)\.?(webp)?)$/‌​', $filename)) {
            /*unlink($file);*/
            echo "FOUND:" . $filepath . PHP_EOL;
        }
        echo PHP_EOL;
    }
?>

输出(短:

string(21) "videos_background.png"
string(21) "videos_background.png"
string(70) "/home/HOSTACCO/public_html/f1/docs/uploads/static/videos_background.png"

string(29) "videos_background-150x150.png"
string(29) "videos_background-150x150.png"
string(78) "/home/HOSTACCO/public_html/f1/docs/uploads/static/videos_background-150x150.png"

唯一的问题是preg_match不起作用,不确定我做错了什么:https://regex101.com/r/EMrI0N/1

1 个答案:

答案 0 :(得分:1)

您的正则表达式中似乎嵌入了非打印控制字符。将代码从此处复制并粘贴到3v4l.org shows

Warning: preg_match(): Unknown modifier '�' in /in/pXQUE on line 4

我已手动重新加密它,现在它works

FOUND:videos_background-150x150.png

我建议您在源代码中重新加密,或者从3v4l复制我的。