Правильный код preg_match для сортировки имен файлов по дате?

#php #preg-match #usort

#php #preg-match #usort

Вопрос:

У меня есть функция, которая берет имена файлов из папки, сортирует их по дате, а затем создает ссылку на файл. Однако это работает только в том случае, если фактическое имя файла содержит пробелы между словами. Если я добавлю дефисы в имя файла, порядок по дате не будет работать корректно.

Имена файлов, которые работают, следующие:

Презентация Январь 2011.pdf

Презентация, август 2010.pdf

Презентация, май 2010.pdf

Если я добавлю дефисы к именам файлов, порядок нарушится:

Презентация-Январь-2011.pdf

Презентация-август-2010.pdf

Презентация-Май-2010.pdf

Как я могу изменить preg_match(), чтобы он учитывал дефисы? Вот мой код:

 $linkdir="documents/presentations";
$dir=opendir("documents/presentations");
$files=array();

while (($file=readdir($dir)) !== false)
{
   if ($file != "." and $file != ".." and $file != "index.php")
   {
    array_push($files, $file);
   }
}

closedir($dir);

function date_sort_desc($a, $b)
{
  preg_match('/w  d{4}/', $a, $matches_a);
  preg_match('/w  d{4}/', $b, $matches_b);
  $timestamp_a = strtotime($matches_a[0]);
  $timestamp_b = strtotime($matches_b[0]);
  if ($timestamp_a == $timestamp_b) return 0;
  return $timestamp_a < $timestamp_b;
}

usort($files, 'date_sort_desc');

foreach ($files as $file){
    $name = substr($file, 0, strrpos($file, '.'));
    $filename = str_replace(" ", " ", $file);
    $name = str_replace("-", " ", $file);
    print "<li><a href='/$linkdir/$filename' rel='external'>$name</a></li>";
}
  

Любая помощь по этому вопросу была бы высоко оценена.

Ответ №1:

Следующие две строки:

 preg_match('/w  d{4}/', $a, $matches_a);
preg_match('/w  d{4}/', $b, $matches_b);
  

Они соответствуют ряду «словоподобных символов» (w), пробелу и затем четырем цифрам (d).

Вы могли бы либо изменить регулярное выражение, чтобы оно допускало пробел или тире: ‘ [ -] ‘ или ‘ ( |-) ‘ вместо пробела ‘'. Это не должно прерывать strtotime() вызовы функций.

Если это так, вы могли бы изменить date_sort_desc() , добавив следующее вверху:

 $a = str_replace("-", " ", $a);
$b = str_replace("-", " ", $b);
  

В этом случае вам не нужно было бы изменять регулярные выражения.

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

1. 1 потому что RikkusRukkus устраняет возможные проблемы с strtotime(). Но это средство должно быть применено до вызова соответствия, иначе шаблон тоже должен быть изменен.

Ответ №2:

'/w d{4}/' ищет слово, пробел и четыре цифры; '/w [ -]d{4}/' следует искать пробел или дефис между словом и цифрами.

Ответ №3:

Тогда что происходит, когда используется другой символ, вы постоянно обновляете свой код. Почему бы не использовать что-то вроде /w W?d{4}/ для захвата любого не буквенно-цифрового символа, который МОЖЕТ появиться?