前段时间我遇到了类似的问题,这是我为完成这项工作而编写的函数(针对您使用的格式稍作修改):
function is_backup($filename, $hour24 = TRUE)
{
// If the filename is not a compressed tarball then it is not a backup
if (strcasecmp('.tar.gz', substr($filename, -7)) !== 0)
return FALSE;
// The various formats
$day = '(?:[1-9]|[12]\d|3[01])';
$month = '(?:[1-9]|1[012])';
$year = '2\d{3}';
$hour = ($hour24 ? '(?:0?\d|1\d|2[0-4])' : '(?:0?\d|1[0-2])(?:am|pm)?');
$minute = $second = '(?:0?\d|[1-5]\d|60)';
$user = '[^\.]+';
// Construct the regular expression
$regex = "/^backup-{$month}\.{$day}\.{$year}_{$hour}-{$minute}-{$second}_{$user}\.tar\.gz$/i";
// preg_match returns "1" if it matches
return preg_match($regex, $filename) === 1;
}
如果您的文件名总是使用前导零(在适用的情况下),那么您也可以只使用它fnmatch()
来进行近似匹配。它使用 shell 模式而不是正则表达式。
$pattern = 'backup-??.??.????_??-??-??_*.tar.gz';
$filename = 'backup-12.09.2012_00-00-06_username.tar.gz';
var_dump(fnmatch($pattern, $filename));
如果您已经在文件系统周围翻找,那么该glob()
功能可能会更方便。它基本上和 . 一样fnmatch()
,但是它不是一个接一个地给它提供文件名,而是使用你当前所在的目录。