2015-11-02 106 views
1

我有幾十萬個來自幾個不同來源的文件。文件中的每一個在名稱中的日期,但文件名結構不同,例如:從文件名PHP提取日期

2015-10-05-importsrc1.txt 
20151004importsrc2.txt 
importsrc3-154826-4521-2015-10-06.csv 
importsrc4-154826-4521-20151006.txt 

我需要處理的是當月和下月忽略任何舊文件的文件。

我已經看到了一些使用循環檢查特定文件的示例,以檢查所需的日期,但我試圖避免太多的循環,並可能使用正則表達式來匹配日期,然後進行比較。

目前我使用下列命令(其中$f是文件名和擴展名):

//CHANGED THIS TO SKIP OLD ONES 
if(strpos(str_replace("-", "", $f), "201510") == false) 
{ 
    continue; 
} 

但上個月這僅適用於目前硬編碼的,最好我需要的東西,如:

//CHANGED THIS TO SKIP OLD ONES 
$extractedDate = preg_match('DATEPATTERN',(str_replace("-", "", $f), "201510"),$extractedDate); 
if(strtotime($extractedDate[0]) < date('Y-m-d',(strtotime ('-1 Month', strtotime (date('Y-m-d))))) 
{ 
    continue; 
} 

我知道我可以簡單地改變我的第一次嘗試,添加另一個條件並使其成爲動態的,但如果我能夠提取日期,這將有助於許多方面。

+0

你試圖說你正在尋找匹配'201510'和'2015-11'像子文件名嗎?類似於['2015 [ - ]?1 [10]'](https://regex101.com/r/tQ8oF4/2)? –

+0

你應該給其他的測試用例(以及一些你不想保留的測試用例),月份和日期是兩位數字嗎? – Tensibai

+0

@stribizhev爲什麼有空格? – Tensibai

回答

3

我一直沒有找到關於如何做到這一點的網絡上的任何東西。似乎沒有確切的科學。使用上述評論,我有以下的正則表達式,其作品以符合規定的文件:

$re = '/(\d{8})|([0-9]{4}-[0-9]{2}-[0-9]{2})|([0-9]{2}-[0-9]{2}-[0-9]{4})/'; 
$str = "20151001-importsrc1.txt"; 
$str = "2015-10-01-importsrc1.txt"; 
$str = "01-10-2015-importsrc1.txt"; 
$str = "importsrc1-2015-10-01.txt"; 
$str = "importsrc1-01102015.txt"; 
$str = "importsrc1-01-10-2015.txt"; 
preg_match($re, $str, $matches); 
$date = str_replace("-", "", $matches[0]); 
print_r($date); 

有三種模式來匹配20151001011020152015-10-0101-10-2015。從這裏我可以對日期進行比較。

這當然不是一個明確的答案,但可能在將來幫助某人。