我了解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的扩展名。
答案 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');