0

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

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

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

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

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

4

5 回答 5

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

于 2012-12-13T00:07:38.113 回答
2

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

你需要的是这两个(感谢一位数的月份,它本身就是一个 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$
于 2012-12-12T22:55:42.950 回答
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 
于 2012-12-12T22:55:57.180 回答
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/')
于 2012-12-12T22:55:59.773 回答
0

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

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

[0-9.:-_]+位将抓取任何数字日期部分。然后[a-zA-Z_-]+将获取用户名。

于 2012-12-12T22:58:01.373 回答