2015-11-02 65 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。从这里我可以对日期进行比较。

这当然不是一个明确的答案,但可能在将来帮助某人。