【问题标题】:PHP Unlink to remove old images via regexPHP取消链接以通过正则表达式删除旧图像
【发布时间】:2017-01-12 15:57:54
【问题描述】:

我正在尝试制作一个 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

【问题讨论】:

  • preg_match( 缺少开场白,这是您的实际代码吗?您还缺少分隔符。
  • @chris85 我已经更新了它以显示我的代码,这是一次运行代码,并且在复制它时缺少引用是一个意外。因为我对正则表达式做了一个小改动。
  • 您仍然缺少正则表达式的分隔符。 php.net/manual/en/regexp.reference.delimiters.php你可能也想脱掉领先的主播和.+,因为看起来你只关心结局。
  • @chris85 我不确定如何在 PHP 的正则表达式中使用它们 regex101.com/r/EMrI0N/1
  • 好吧,glob() 一开始就不是递归的。

标签: php regex preg-match glob unlink


【解决方案1】:

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

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

我已经手动重新输入了它,现在是works

FOUND:videos_background-150x150.png

我建议要么重新输入你的来源,要么从 3v4l 复制我的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    相关资源
    最近更新 更多