0

かなり前に、ユーザーがファイルを私の Web サイトにアップロードするときのファイル名のフォーマット方法を変更することにしました (これは素晴らしいアイデアでした! )。ファイル名に UNIX_Timestamp を含めるようにしました。データベースが消去され、ファイル名の構造が大幅に変更されました。現在、ファイル名から有効なタイムスタンプを復元しようとしていますが、これまでのところ半分しか復元できていません。

事前に、ファイル名を次のように構成しました。

dcd1322318879.png - UNIX タイムスタンプが先頭に追加された文字。

次に、人々がログインを開始できるようにし、ファイル名をより人間に優しいものにしました。現在、彼らは次のように読んでいます。

username-09092012-183422.jpeg ここで、username はログインしているユーザー名です。私が今抱えている問題は、まず、以前のファイル名(ユーザーデータと人間に優しい日付なし)の正規表現がひどいという事実です。私のコードは次のとおりでした:

$newDate = preg_replace("/[^0-9]/","", $data['name']);

ただし、ユーザー名に数字を含めることができるため、現在は明らかに機能しません。したがって、その数字は日付の最終的な数字にも含まれます。

とにかくこの問題を解決できるかどうか疑問に思っています。ハイフン(-)を追加したという事実は、セパレータとして使用できるので便利だと思いますが、どこから始めればよいかわかりません。日付と時刻を含むファイル名の最後の 2 つの部分を取得するだけでよいので、それらを UNIX タイムスタンプに変換できます。

どんな助けでも大歓迎です

4

5 に答える 5

1

これで、UNIXタイムスタンプへの変換を含むさらに別の方法があります。

preg_match_all('/[0-9]+/', $string, $matches);
$d =  DateTime::createFromFormat('dmY His', $matches[0][0].' '.$matches[0][1]);
$timestamp = $d->getTimestamp();
于 2012-09-09T19:02:29.610 に答える
1

あなたの質問から、ハイフンを正規表現の構造として使用できると思います。つまり、ユーザー名と日付にはそれらが含まれません。

したがって、この非常に単純なパターンが機能します。

/(.*?)-(.*?)-(.*)/

グループ 1 にはユーザー名が含まれ、グループ 2 には日付が含まれ、グループ 3 にはファイル名が含まれます (ファイル名 (3 番目のハイフンの後のすべて) は、さらにハイフンを含めて何でもかまいません)。

(はドットであり、.*?によって「ゼロ回以上」で量化され、は量指定子を遅延させ、が貪欲に文字列の最後まで競争しないようにします)*?.

于 2012-09-09T19:05:54.330 に答える
1

これを試して:

preg_match_all("/(\d{8})-(\d+)/", $str, $matches);
于 2012-09-09T18:51:24.123 に答える
1

最も簡単な方法は使用することです

  $array = explode ("-", $filename); 
  print_r ($array);

本当に正規表現を使用したい場合を除きますが、システムがすべての作成を行っているため、必要ないと思います。つまり、ユーザー入力はありません...スクリプトの設定方法にも依存します。

于 2012-09-09T18:52:38.053 に答える
0

ファイル名から3つのコンポーネントすべてを解析するには、次のことを試してください

<?php
preg_match(
    "/^([\w]+)-(\d{8})-(\d{6})/",
    "username-09092012-183422.jpeg",
    $matches);

echo "user=[{$matches[1]}]<br/>date=[{$matches[2]}]<br/>time=[{$matches[3]}]<br/>";
?>

生成するもの:

user=[username]
date=[09092012]
time=[183422]

また、ファイル名に日付をとして組み込むことを検討することもできますYYYYMMDD。例えば:

'09092012' => '20120909'

これにより、必要に応じてデータを日付で並べ替えることが簡単になります。

于 2012-09-12T01:52:08.380 に答える