什么正则表达式用于查找备份文件?

时间:2012-12-12 22:51:08

标签: php regex preg-match

这是我将在preg_match中查找的示例备份文件。我试图找到最好的正则表达式只捕获这些类型的文件。它需要检查“备份”,然后检查日期(任何日期),然后检查时间(任何时间)用户名并完成.tar.gz

  

备份12.9.2012_00-00-06_username.tar.gz

截至目前,我有以下工作,但我正在寻找它更具体,所以我不会错误地拉其他东西。

preg_match('/backup-[0-9].*_username/', $file)

当然“用户名”在完成时将是一个php变量

5 个答案:

答案 0 :(得分:3)

前段时间我遇到了类似的问题,这是我写的用来完成工作的函数(对你使用的格式稍作修改):

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()相同,但它不是逐个地提供文件名,而是使用您当前所在的目录。

答案 1 :(得分:2)

我会选择简单的glob - 这里不需要一个完整的正则表达式。

你需要的是这两个(感谢一个数字的月份,它本身是一个WTF,应该固定为总是使用两位数值):

  • backup-??.?.????_??-??-??_username.tar.gz
  • backup-??.??.????_??-??-??_username.tar.gz

可能您还需要为单位数天添加两个案例。或者,如前所述,请始终使用正确的dd.mm.yyyy日期。

无论如何,如果你真的想使用正则表达式:

^backup-\d{1,2}.\d{1,2}.\d{4}_\d{2}-\d{2}-\d{2}_username\.tar\.gz$

答案 2 :(得分:0)

[0-9]是一位数。

.*是任何字符序列。

因此,/backup-[0-9].*_username/也会匹配,例如backup-1ABCD EFGH_username

你可能意味着什么

backup-[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{4}_[0-9]{2}-[0-9]{2}-[0-9]{2}_username 

或者,有点松散,

backup-[0-9.-_]+username 

答案 3 :(得分:0)

如果所有文件中的位数相同,则以下表达式有效。

preg_match('/backup-[0-9]{2}\.[0-9]\.[0-9]{4}_[0-9]{2}-[0-9]{2}-[0-9]{2}_username\.tar\.gz/')

或使用\d表示数字:

preg_match('/backup-\d\d\.\d\.\d\d\d\d_\d\d-\d\d-\d\d_username\.tar\.gz/')

答案 4 :(得分:0)

如果'backup'和'_username'之间的所有内容都与日期/时间相关,建议保持简单,不需要在更改日期格式时更改正则表达式。只需允许数字和标点符号:

/backup-[0-9.:-_]+_[a-zA-Z_-]+\.tar\.gz/

[0-9.:-_]+位将抓取任何digity-date-ish部分。然后[a-zA-Z_-]+将获取用户名。