Исправить код preg_match для сортировки имен файлов по дате? - PullRequest
0 голосов
/ 07 апреля 2011

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

Имена файлов, которые работают:

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

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

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

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

Presentation-января-2011.pdf

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

Presentation-May-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(" ", "%20", $file);
    $name = str_replace("-", " ", $file);
    print "<li><a href='/$linkdir/$filename' rel='external'>$name</a></li>";
}

Любая помощь по этому вопросу будет принята с благодарностью.

Ответы [ 3 ]

2 голосов
/ 07 апреля 2011

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

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 голос
/ 07 апреля 2011

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

0 голосов
/ 12 января 2012

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

...