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

In PHP, find an existing file using a regex pattern for the file name

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

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

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

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

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

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

谁能想出这个函数的"magic"?我似乎无法理解它。谢谢。

更新: assets 目录是另一个目录的副本,但是每个文件都被重命名为包含一个连字符,然后在末尾包含一个八字符的唯一散列文件名(用于缓存清除)。因此,原始文件 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。

这是一种基于您的示例的方法。

我假设您的校验和是固定长度的,因此您只需删除文件名的第(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');