このようなものが動作するはずです:
$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";