我正在尝试通过删除添加到其中的时间戳来检索图像的文件名。图像可能有也可能没有附加时间戳的图像。例如,它可能采用以下格式:
mylogo.1358256757.jpg
或者可能只是:
mylogo.jpg
可以是jpg
,png
或任何其他有效的图片文件。
时间戳是使用:
生成的$date = new DateTime();
$timestamp = $date->getTimestamp();
我需要一个保留原始图像名称的PHP正则表达式,假设:
我可以使用子串等我只是想知道最安全的方法是什么。 PHP时间戳总是正好是10位数吗?
答案 0 :(得分: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";
答案 1 :(得分:1)
如果Regex不是强制性的,您也可以在&#39;上分割(例如爆炸)文件名。 (点)并且仅使用第一和第三部分,将它们粘合在一起以获得没有时间戳部分的文件名。
如果存在&#39;你问题的一部分(最简单的形式)是检查“令牌”数量的问题。你是从爆炸(或类似)功能中返回的。
答案 2 :(得分:0)
您可以使用preg_replace
您将使用此
获取文件名$prevFileName = "mylogo.1358256757.jpg";
$fileName = preg_replace('/(\\.\\d+\\.)/', '.', $prevFileName);
echo $fileName;