#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 часа