带时间戳文件的PHP字符串处理帮助

问题描述:

我正在尝试解决使用php的字符串函数从文件名中删除时间戳的最佳方法。时间戳是从文件名的其余部分通过左侧的下划线和点开始右侧的文件扩展名(例如myfile_12343434.jpg) - 我只想在下划线之前的文本,虽然这个长度可以变化。处理这个问题的最好方法是什么?谢谢!带时间戳文件的PHP字符串处理帮助

编辑离开扩展的完整(包括例如.gd2.JPEG)做到这一点:

$new = preg_replace("/_\\d+(\\.[a-z0-9]+)\$/i","\\1",$orig); 

这有效地去只有“_123”的一部分,在不那么漂亮的方式。对于我们之中的纯粹主义者,具有前向断言,只有消除了时间戳的版本:

$new = preg_replace("/_\\d+(?=\\.[0-9a-z]+\$)/i","",$orig); 
+1

+1对于preg_replace,这会使文件名的其余部分保持不变(包括扩展名)。但是我会使用'preg_replace(“/ _ \ d + /”,“”,$ orig)',因为我们知道时间戳应该是数字的。 – 2010-08-11 22:20:02

+0

@JGB:嗯,这也将删除我认为是问题的扩展。但我可能会错,在这种情况下,'\ d'是解决问题的最佳方法。 – mvds 2010-08-11 22:24:04

+0

感谢您的建议家伙 - 是的,我想保留扩展:)我会玩弄这些建议,以得到每个人如何工作的感觉 – dan727 2010-08-11 22:28:29

您可以使用此:

$filename = explode("_", $orig_filename)[0]; 
+1

你不能以这种方式提取数组的第一个元素,你必须使用一个中间变量: $ a = explode(“_”,$ orig_filename); $ filename = $ a [0]; – darma 2010-08-11 22:22:03

+0

@darma - 你不需要“必须”。例如:list($ filename)= explode('_',$ orig_filename); – GZipp 2010-08-11 23:35:13

最好的办法是使用preg_replace()指定精确匹配。良好的开端是类似如下(这也会保护的扩展名):

$new = preg_replace("/_\d+/","",$orig); 

但由于这是一个UNIX时间戳,我们可以做的,通过指定的数字部分,它将匹配的长度更好:

$new = preg_replace("/_\d{1,11}/","",$orig);