1

追加されたタイムスタンプを削除して、画像のファイル名を取得しようとしています。画像には、タイムスタンプが付いている場合と付いていない場合があります。たとえば、次の形式になります。

mylogo.1358256757.jpg

または単に次のようになります。

mylogo.jpg

jpgpngまたはその他の有効な画像ファイルである可能性があります。

タイムスタンプは次を使用して生成されました。

$date = new DateTime();
$timestamp = $date->getTimestamp();

次の場合、元のイメージ名を保持する PHP 正規表現が必要です。

  • 画像には、数字やドットなど、任意のファイル名を付けることができます。
  • タイムスタンプがまったくない場合があります。

部分文字列などを使用できますが、最も安全な方法は何だろうと思っています。PHP タイムスタンプは常に正確に 10 桁になりますか?

4

3 に答える 3

2

このようなものが動作するはずです:

$filename = "mylogo.1358256757.jpg";
$filename = preg_replace('/^(.*)\.\d+\.(gif|jpg|png)$/', '$1.$2', $filename);

特定の桁数 (たとえば 8) のみをタイムスタンプと見なしたい場合は、次のように修飾する必要があります\d

$filename = preg_replace('/^(.*)\.\d{8,}\.(gif|jpg|png)$/', '$1.$2', $filename);
//                                  ^^^^ 8 or more digits

疑わしいタイムスタンプが特定のウィンドウにあるかどうかを確認するために、いくつかのセマンティック チェックを行うこともできます。次の例では、ファイル名に埋め込まれたタイムスタンプが過去 1 年間の日付/時刻を表していることを確認します。そうである場合は置換を行い、そうでない場合は元のファイル名を返すだけです (このコードには PHP 5.3.0 以降が必要です)。

$filename = "mylogo.1358256757.jpg";     

$filename = preg_replace_callback(
    '/^(.*)\.(\d+)\.(gif|jpg|png)$/',
    function ($matches) {
        $when = new DateTime();
        if ($when->setTimestamp(intval($matches[2])) !== false) {
            $start = new DateTime('1 year ago');
            $end   = new DateTime();

            // Is it a timestamp in the last year?
            if ($when > $start && $when < $end) {
                return $matches[1] . '.' . $matches[3];
            }
        }

        // Doesn't appear to be valid, return the original
        // filename.
        return $matches[0];
    },
    $filename);

echo $filename . "\n";
于 2013-01-15T13:46:20.903 に答える
2

正規表現が必須でない場合は、ファイル名を「.」で分割 (たとえば分解) することもできます。(ドット) を使用し、最初と 3 番目の部分のみを使用し、それらをつなぎ合わせて、タイムスタンプ部分のないファイル名を取得します。

質問の「存在する場合」の部分は、(最も単純な形式で)爆発(または同様の)関数から返された「トークン」の数を調べることです。

于 2013-01-15T13:52:13.297 に答える
0

使用できますpreg_replace

preg_replace

これを使用してファイル名を取得します

$prevFileName = "mylogo.1358256757.jpg";
$fileName = preg_replace('/(\\.\\d+\\.)/', '.', $prevFileName);
echo $fileName;
于 2013-01-15T13:53:37.023 に答える