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()して近似一致を作成することもできます。正規表現の代わりにシェル パターンを使用します。

$pattern = 'backup-??.??.????_??-??-??_*.tar.gz';
$filename = 'backup-12.09.2012_00-00-06_username.tar.gz';
var_dump(fnmatch($pattern, $filename));

すでにファイル システムを調べている場合は、このglob()関数の方が便利かもしれません。基本的には と同じfnmatch()ですが、ファイル名を 1 つずつ入力する代わりに、現在のディレクトリを使用します。

于 2012-12-13T00:07:38.113 に答える
2

私は単純なグロブを使用します-ここでは本格的な正規表現は必要ありません。

必要なのは次の2つです(1桁の月はそれ自体がWTFであり、常に2桁の値を使用するように修正する必要があります)。

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

おそらく、1桁の日に2つのケースを追加する必要もあります。または、前に提案したように、常に適切な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 に答える