Извлечь дату из имени файла PHP

1

У меня есть несколько сотен тысяч файлов из нескольких разных источников. Каждый из файлов имеет дату в имени, однако структура имени файла отличается, например:

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] ?
  • 0
    Вам следует дать другие контрольные примеры (и некоторые из них, которые вы не хотите сохранять), всегда ли месяц и день состоят из двух цифр?
Показать ещё 5 комментариев
Теги:

1 ответ

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

Существует три шаблона для соответствия 20151001, 01102015, 2015-10-01, 01-10-2015. Отсюда я смогу сравнить дату.

Это, конечно, не окончательный ответ, но может помочь кому-то в будущем.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню