0

不久前,当用户将文件上传到我的网站时,我决定更改文件名的格式(这是一个好主意!),以在文件名中包含 UNIX_Timestamp,不幸的是,在与我的文件相关联的时间戳之后,这证明非常有用数据库被擦除,文件名结构发生了很大变化,我目前正在尝试从文件名中恢复有效的时间戳,但是到目前为止我只能恢复一半。

之前,我将文件名结构化为:

dcd1322318879.png - 以 unix 时间戳开头的字母。

然后,我允许人们开始登录并使文件名更加人性化,他们现在如下所示;

username-09092012-183422.jpeg 其中 username 是登录的用户名。我现在遇到的问题是,首先,我对正则表达式很糟糕,对于以前的文件名(没有用户数据和人类友好的日期),我的代码是:

$newDate = preg_replace("/[^0-9]/","", $data['name']);

但是显然现在这不起作用,因为用户名可以包含数字,因此该数字也将包含在日期的最终数字中。

我目前想知道是否无论如何我可以解决这个问题,我想我添加连字符(-)的事实会很有用,因为我可以将它用作分隔符,但是我不知道从哪里开始。我只需要获取文件名的最后两部分,其中包含日期和时间,这样我就可以将它们转换为 unix 时间戳。

任何帮助是极大的赞赏

4

5 回答 5

1

试试这个:

preg_match_all("/(\d{8})-(\d+)/", $str, $matches);
于 2012-09-09T18:51:24.123 回答
1

最简单的方法是使用

  $array = explode ("-", $filename); 
  print_r ($array);

除非您真的想使用正则表达式,但我认为不需要它,因为系统是完成所有创建的系统。这意味着将没有用户输入......它也可能取决于您如何设置脚本。

于 2012-09-09T18:52:38.053 回答
1

你去了,还有另一种方式,包括转换为 unix 时间戳:

preg_match_all('/[0-9]+/', $string, $matches);
$d =  DateTime::createFromFormat('dmY His', $matches[0][0].' '.$matches[0][1]);
$timestamp = $d->getTimestamp();
于 2012-09-09T19:02:29.610 回答
1

根据您的问题,我假设连字符可以用作正则表达式的结构。也就是说,用户名和日期不会包含它们。

那么,这个非常简单的模式就可以工作了:

/(.*?)-(.*?)-(.*)/

第 1 组包含用户名,第 2 组包含日期,第 3 组包含文件名(请注意,文件名(第三个连字符之后的所有内容)可以是任何内容,包括更多连字符)。

(the.*?是点,由 '0 次或多次'量化*,并且?使量词变得懒惰,因此.不只是贪婪地跑到字符串的末尾)

于 2012-09-09T19:05:54.330 回答
0

要从您的文件名中解析所有三个组件,请尝试以下操作:

<?php
preg_match(
    "/^([\w]+)-(\d{8})-(\d{6})/",
    "username-09092012-183422.jpeg",
    $matches);

echo "user=[{$matches[1]}]<br/>date=[{$matches[2]}]<br/>time=[{$matches[3]}]<br/>";
?>

产生:

user=[username]
date=[09092012]
time=[183422]

您也可以考虑将文件名中的日期合并为YYYYMMDD. 例如:

'09092012' => '20120909'

如果您愿意,这将使您更容易按日期对数据进行排序。

于 2012-09-12T01:52:08.380 回答