Использование Regex для сортировки списка файлов - PullRequest
2 голосов
/ 25 марта 2020

Я пишу скрипт для сортировки списка файлов, получения самого нового файла, который соответствует определенному имени файла, и копирования его в другую папку. Я пишу это в PHP, а затем настраиваю его на запуск в определенное время каждый день с использованием CRON.

Файлы названы так: VS-order-export-105. xml VS-order-export-104. xml current-VS-order-export-105, xml current-VS-order-export.104. xml

Мне нужно получить последнюю из эти файлы с шаблоном 'order-export- (number). xml'. Эти префиксы «current-» следует игнорировать.

Кажется, я не могу заставить Regex сделать это правильно. Вот что у меня есть:

<?php $src = '/public_html/folder/exports/';
$files_src = scandir($src, SCANDIR_SORT_DESCENDING);
foreach($files_src as $file) {
    if (preg_match('/(^VS-), (.*)/A', $file) && !is_dir($src . $file)) {
        $newest_file_src = $files_src[1];
        $newest_file_path_src = $src . $files_src[1];
        $dest_file_path = '/public_html/orders/';
        rename($newest_file_path_src, $dest_file_path);
    }
} ?>

Пожалуйста, кто-нибудь может указать, что я делаю неправильно?

Заранее спасибо!

1 Ответ

0 голосов
/ 25 марта 2020

В вашем шаблоне вы пытаетесь найти запятую, за которой следует пробел, которого нет.

Для более точного c шаблона вы можете использовать

\AVS-order-export-\d+\.xml\z
  • \A Начало строки
  • VS-order-export- Совпадение буквально
  • \d+\.xml Совпадение 1+ цифр и .xml
  • \z Конец строки

Regex demo

Например

if (preg_match('/\AVS-order-export-\d+\.xml\z/', $file)) {
...