更正preg_match代码按日期排序文件名?

时间:2011-04-07 08:38:37

标签: php preg-match usort

我有一个函数,它从文件夹中获取文件名,按日期对它们进行排序,然后创建一个指向该文件的链接。但是,这仅在实际文件名在单词之间有空格时才有效。如果我在文件名中添加连字符,则按日期排序无效。

有效的文件名是:

  

2011年1月的演示文稿.pdf

     

2010年8月的演示文稿.pdf

     

2010年5月的演示文稿.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(" ", "%20", $file);
    $name = str_replace("-", " ", $file);
    print "<li><a href='/$linkdir/$filename' rel='external'>$name</a></li>";
}

对此的任何帮助都将非常感激。

3 个答案:

答案 0 :(得分:2)

以下两行:

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)

'/ \ w + \ d {4} /'查找单词,空白和四位数字; '/ \ w + [ - ] \ d {4} /'应该在单词和数字之间寻找空格或连字符。

答案 2 :(得分:0)

然后当使用不同的字符时会发生什么,您不断更新代码。为什么不使用像/ \ w + \ W?\ d {4} /之类的东西来捕捉可能出现的任何非字母数字字符?