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

如果 Regex 不是强制性的,您还可以在“。”上拆分(例如分解)文件名。(点)并且只使用第一和第三部分,将它们粘合在一起以获得没有时间戳部分的文件名。

您问题的“如果存在”部分(以最简单的形式)是检查从explode(或类似)函数返回的“令牌”数量的问题。

于 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 回答