从PHP文件名中提取日期

从PHP文件名中提取日期,php,regex,Php,Regex,我有几十万个来自不同来源的文件。每个文件的名称中都有日期,但是文件名结构不同,例如: 2015-10-05-importsrc1.txt 20151004importsrc2.txt importsrc3-154826-4521-2015-10-06.csv importsrc4-154826-4521-20151006.txt 我需要处理当前月份和下个月的文件,忽略任何旧文件 我已经看到了一些如何使用循环检查特定文件以检查所需日期的示例,但是我试图避免过多的循环,并可能使用regex模式匹配

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

2015-10-05-importsrc1.txt
20151004importsrc2.txt
importsrc3-154826-4521-2015-10-06.csv
importsrc4-154826-4521-20151006.txt
我需要处理当前月份和下个月的文件,忽略任何旧文件

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

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

但这只适用于前一个月,目前是硬编码的,理想情况下,我需要如下内容:

//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;
}
//将此更改为跳过旧的
$extractedDate=preg_match('DATEPATTERN',(str_replace(“-”,“,$f),“201510”),$extractedDate);
如果(STROTIME($extractedDate[0])<日期('Y-m-d'),(STROTIME('-1个月),STROTIME(日期('Y-m-d'))))
{
继续;
}

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

我在网上没有找到任何关于如何做到这一点的方法。似乎没有确切的科学依据。使用上面的注释,我有以下正则表达式,可以匹配指定的文件:

$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);
有三种模式需要匹配,
20151001
01102015
2015-10-01
01-10-2015
。从这里我可以对日期进行比较


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

我在网上没有找到任何关于如何做到这一点的方法。似乎没有确切的科学依据。使用上面的注释,我有以下正则表达式,可以与指定的文件相匹配:

$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);
有三种模式需要匹配,
20151001
01102015
2015-10-01
01-10-2015
。从这里我可以对日期进行比较


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

你是想说你正在寻找匹配
201510
2015-11
文件名中的子字符串?类似?你应该给出其他测试用例(以及一些你不想保留的测试用例),月和日总是两位数吗?@Stribizev为什么是空格?@Tensibai:因为它有点像。问题还不清楚,这就是我试图从OP中提取更多细节的方式。@Stribizev哦,好的。你没明白吗?你是想说你想匹配
201510
2015-11
像文件名中的子字符串吗你应该给出其他的测试用例(还有一些你不想保留的),月和日是否总是两位数?@Stribizev为什么是空格?@Tensibai:因为它是这样的。问题不清楚,这就是我如何试图从OP中提取更多细节的原因。@Stribizev哦,好的。没有明白