我知道glob函数。但是,我需要匹配一个正则表达式模式。说我有以下文件目录:
/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的扩展名。
这是根据您的示例进行操作的一种方法。
我假设您的校验和是固定长度的,因此您只需删除文件名的最后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');
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句