我有一个函数,它从文件夹中获取文件名,按日期对它们进行排序,然后创建一个指向该文件的链接。但是,这仅在实际文件名在单词之间有空格时才有效。如果我在文件名中添加连字符,则按日期排序无效。
有效的文件名是:
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>";
}
对此的任何帮助都将非常感激。
答案 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} /之类的东西来捕捉可能出现的任何非字母数字字符?