很久以前,当用户将文件上传到我的网站(这是一个好主意!)以在文件名中包含UNIX_Timestamp时,我决定改变文件名的格式化方式,这证明非常很遗憾,在删除与我的数据库中的文件相关联的时间戳后,文件名结构发生了很大的变化,我目前正在尝试从文件名中恢复有效的时间戳,但到目前为止,我只能恢复一半。
事先,我将文件名结构化为:
dcd1322318879.png - unix时间戳前面的字母。
然后,我允许人们开始登录并使文件名更加人性化,他们现在阅读如下;
username-09092012-183422.jpeg其中username是登录用户名。我现在遇到的问题是,首先,我对正则表达式很糟糕,对于以前的文件名(没有用户数据和人性化日期)我的代码是:
$newDate = preg_replace("/[^0-9]/","", $data['name']);
然而,显然现在不起作用,因为用户名可以包含数字,因此该数字也将包含在日期的最终数字中。
我目前想知道无论如何我都可以解决这个问题,我想我添加连字符( - )的事实将是有用的,因为我可以将它用作分隔符,但我不知道从哪里开始。我需要获取文件名的最后两部分,其中包含日期和时间。时间,所以我可以将它们转换为unix时间戳。
非常感谢任何帮助
答案 0 :(得分:1)
试试这个:
preg_match_all("/(\d{8})-(\d+)/", $str, $matches);
答案 1 :(得分:1)
最简单的方法是使用
$array = explode ("-", $filename);
print_r ($array);
除非你真的想要使用正则表达式,但我不认为它是必需的,因为系统是完成所有创建的人。这意味着没有用户输入...它还取决于您如何设置脚本。
答案 2 :(得分:1)
你可以采用另一种方式,包括转换为unix时间戳:
preg_match_all('/[0-9]+/', $string, $matches);
$d = DateTime::createFromFormat('dmY His', $matches[0][0].' '.$matches[0][1]);
$timestamp = $d->getTimestamp();
答案 3 :(得分:1)
从你的问题,我假设连字符可以用作正则表达式的结构。也就是说,用户名和日期不会包含它们。
那么,这个非常简单的模式就可以了:
/(.*?)-(.*?)-(.*)/
组1将包含用户名,组2包含日期,组3包含文件名(请注意文件名(第三个连字符后面的所有内容)可以是任何内容,包括更多连字符)。
(.*?
是点,由*
量化为'零次或多次',?
使量词变得懒惰,因此.
不只是贪婪地竞争到字符串的末尾)
答案 4 :(得分:0)
要解析文件名中的所有三个组件try this:
<?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'
如果您愿意,可以更轻松地按日期对数据进行排序。