【发布时间】: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