2010-08-11 29 views
2

我正在嘗試解決使用php的字符串函數從文件名中刪除時間戳的最佳方法。時間戳是從文件名的其餘部分通過左側的下劃線和點開始右側的文件擴展名(例如myfile_12343434.jpg) - 我只想在下劃線之前的文本,雖然這個長度可以變化。處理這個問題的最好方法是什麼?謝謝!帶時間戳文件的PHP字符串處理幫助

回答

3

編輯離開擴展的完整(包括例如.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

0

您可以使用此:

$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

0

最好的辦法是使用preg_replace()指定精確匹配。良好的開端是類似如下(這也會保護的擴展名):

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

但由於這是一個UNIX時間戳,我們可以做的,通過指定的數字部分,它將匹配的長度更好:

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