在 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');
我知道 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');