Проверьте, заканчивается ли имя строкой в PHP

#php #preg-match

Вопрос:

В моем кэше папок у меня есть десятки файлов, имя которых filename-number.json , например

 sifriugh-80.json
dlifjbhvzique-76.json
dfhgzeiuy-12.json
...
 

У меня есть простой скрипт, который очищает мой каталог кэша каждые 2 часа, удаляя файлы старше 2 часов:

 $fileSystemIterator = new FilesystemIterator('cache');
$now = time();
foreach ($fileSystemIterator as $file) {
    if ($now - $file->getCTime() >= 3 * 3600) // 2 hours
        unlink('cache/' . $file->getFilename());
}
 

Теперь я собираюсь удалять только каждые 2 часа файлы, номер которых (до .json , но не в том случае, если номер присутствует в начале файла) НЕ заканчивается на -100.json , а те, которые заканчиваются на -100.json , только каждые 7 дней.

Я знаю, что я могу использовать preg_match() для получения имен, но есть ли какой-либо эффективный способ выполнить это?

Комментарии:

1. Итак, вы «хотите только удалить… файлы, номер которых … не заканчивается на -100.json , а те, которые заканчиваются на -100.json » => вы имеете в виду, что хотите удалить все файлы? Пожалуйста, уточните и поделитесь preg_match кодом, который вы пробовали с вашим выражением — это прояснит его еще лучше.

Ответ №1:

Существует гораздо более простой способ, чем регулярное выражение с использованием PHP 8 str_ends_with() : https://www.php.net/manual/en/function.str-ends-with.php

 if (str_ends_with($file->getFilename(), '100.json)) {
    // unlink at needed time
} else {
    // unlink at needed time
}
 

Для PHP 7 существует несколько способов его эмуляции, проверьте внизу https://www.php.net/manual/en/function.str-ends-with.php

Ответ №2:

Я не понимаю, почему вы не должны использовать preg_match . Здесь так хорошо. Перед использованием preg_match вы должны проверить первый символ в имени файла и пропустить следующий код, если он is_numeric . Если оно не числовое, вам нужно получить только окончание «-» может быть представлено нулем или единицами число 1 или более цифр .json окончание (шаблон может быть примерно таким /-?d .json$/ ) После этого вы можете проанализировать его и узнать действительное число before .json, ваша проверка будет выглядеть примерно так

Если символ «-» существует, а число равно 100, проверьте дату на 7 дней

Если число не равно 100, проверьте дату на 2 часа