从文件名中删除php时间戳,如果它存在

时间:2013-01-15 13:42:27

标签: php regex timestamp substring

我正在尝试通过删除添加到其中的时间戳来检索图像的文件名。图像可能有也可能没有附加时间戳的图像。例如,它可能采用以下格式:

mylogo.1358256757.jpg

或者可能只是:

mylogo.jpg

可以是jpgpng或任何其他有效的图片文件。

时间戳是使用:

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

我需要一个保留原始图像名称的PHP正则表达式,假设:

  • 图像可以包含任何可能的文件名,包括数字和 点,和
  • 它可能根本没有时间戳!

我可以使用子串等我只是想知道最安全的方法是什么。 PHP时间戳总是正好是10位数吗?

3 个答案:

答案 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

preg_replace

您将使用此

获取文件名
$prevFileName = "mylogo.1358256757.jpg";
$fileName = preg_replace('/(\\.\\d+\\.)/', '.', $prevFileName);
echo $fileName;