#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}/ для захвата любого не буквенно-цифрового символа, который МОЖЕТ появиться?