从文件名 PHP 中提取日期

The*_*Rat 1 php regex

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

2015-10-05-importsrc1.txt
20151004importsrc2.txt
importsrc3-154826-4521-2015-10-06.csv
importsrc4-154826-4521-20151006.txt
Run Code Online (Sandbox Code Playgroud)

我需要处理当月和下个月的文件,忽略任何较旧的文件。

我已经看到了一些如何使用循环检查特定文件来检查所需日期的示例,但是我试图避免太多循环,并可能使用正则表达式来模式匹配日期,然后进行比较。

目前我使用以下内容(其中$f是文件名和扩展名):

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

但这仅适用于上个月,并且目前是硬编码的,理想情况下我需要类似的东西:

//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;
}
Run Code Online (Sandbox Code Playgroud)

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

The*_*Rat 6

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

$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);
Run Code Online (Sandbox Code Playgroud)

共有三种模式可供匹配20151001,,, 01102015。从这里我将能够对日期进行比较。2015-10-0101-10-2015

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