在PHP中,使用正则表达式模式查找文件名的现有文件

时间:2015-05-22 21:51:48

标签: php regex filenames

我了解glob function。但是,我需要匹配正则表达式模式。假设我有以下文件目录:

/assets
  |- logo-abd6d458.png
  |- logo-big-bd7543cd.png
  |- another-ab87dbf0.css
  +- something-784b52ac.png

我需要一个PHP函数,当我只知道文件名的开头扩展名时,该函数应返回此目录中现有文件的文件名。例如:

function asset_name($start, $extension) {
  // Some magic here
}

asset_name('logo', 'png');应返回"logo-abd6d458.png",但不应返回"logo-big-bd7543cd.png"

asset_name('logo-big', 'png');应该返回"logo-big-bd7543cd.png"

任何人都可以找出"魔法"这个功能?我似乎无法绕过它。感谢。

更新:资源目录是另一个目录的副本,但是每个文件都被重命名为包含一个连字符,然后在文件名末尾包含一个八字符的唯一哈希值(对于缓存清除)。因此,原始文件logo.png将重命名为logo-abd6d458.png。另一个文件如logo-big.something.else.here.png将成为logo-big.something.else.here-dcba4321.png,然后我会使用asset_name('logo-big.something.else.here', 'png');

当调用该函数时,我将始终使用$ start的整个原始文件名和$ extension的扩展名。

1 个答案:

答案 0 :(得分:1)

根据您的例子,这是一种方法。

我假设你的校验和是固定长度的,所以你可以删除文件名的最后一个字符的(10 +长度的扩展名)并进行比较。

<?php

function asset_name($start, $ext)
{
    $dir = 'assets';
    $files = glob($dir.'/*.'.$ext);

    $suffixLength = -9 - strlen($ext) - 1;
    foreach ($files as $file) {
        $name = substr($file, strlen($dir)+1, $suffixLength);
        if ($name === $start) {
            return $file;
        }
    }

    throw new Exception('file not found');
}

$file = asset_name('logo', 'png');