从Filename PHP中提取日期

时间:2015-11-02 10:51:36

标签: php regex

我有来自几个不同来源的几十万个文件。每个文件都有名称中的日期,但文件名结构不同,例如:

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;
}

我知道我可以简单地改变我的第一次尝试,添加另一个条件并使其变得动态但是如果我能够提取日期,这将在很多方面有所帮助。

1 个答案:

答案 0 :(得分:4)

我在网上找不到有关如何执行此操作的任何内容都失败了。似乎没有确切的科学。使用上面的注释我有以下正则表达式,可以匹配指定的文件:

$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匹配。从这里我可以比较日期。

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