私はしばらく前に同様の問題を抱えていましたが、これは私が仕事をするために書いた関数です(使用する形式に合わせてわずかに変更されています):
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()
して近似一致を作成することもできます。正規表現の代わりにシェル パターンを使用します。
$pattern = 'backup-??.??.????_??-??-??_*.tar.gz';
$filename = 'backup-12.09.2012_00-00-06_username.tar.gz';
var_dump(fnmatch($pattern, $filename));
すでにファイル システムを調べている場合は、このglob()
関数の方が便利かもしれません。基本的には と同じfnmatch()
ですが、ファイル名を 1 つずつ入力する代わりに、現在のディレクトリを使用します。