像这样的东西应该工作:
$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";