You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP中拆分数组内文件名,提取最后一个连字符后的数字

嘿,这个需求我太熟了!要提取文件名里最后一个连字符后的数字,PHP里有好几种靠谱的玩法,我给你捋捋最实用的几个:

方法一:strrpos + substr组合(高效直接)

这是最接地气的方案——先定位最后一个-的位置,再从它的下一位开始截取字符串,直接拿到目标数字:

$filename = "file-name-123";
// 找到最后一个'-'的位置
$lastDashPos = strrpos($filename, '-');
// 从最后一个'-'的下一位开始截取
$number = substr($filename, $lastDashPos + 1);

// 稳妥起见,可以加个数字验证
if (is_numeric($number)) {
    echo $number; // 输出 123
}

划重点:strrpos是找字符最后一次出现的位置,刚好适配我们的需求;如果文件名里没-,它会返回false,实际用的时候记得加个判断避免报错。

方法二:explode + end拆数组(代码简洁)

把文件名按-拆成数组,直接取数组最后一个元素就行,代码看着清爽:

$filename = "my-document-4567";
$parts = explode('-', $filename);
$number = end($parts); // 输出 4567

// 验证是不是纯数字可以用ctype_digit
if (ctype_digit($number)) {
    echo $number;
}

小提醒:如果文件名以-结尾,end($parts)会返回空字符串,这种边界情况要提前考虑哦。

方法三:正则表达式(带校验一步到位)

如果想同时确保最后一段是数字,正则可以一步搞定,还能过滤不符合规则的情况:

$filename = "report-2024-08-99";
preg_match('/-(\d+)$/', $filename, $matches);

// 匹配到的数字存在$matches[1]里
if (!empty($matches[1])) {
    echo $matches[1]; // 输出 99
}

正则/-(\d+)$/的意思是:精准匹配最后一个-,然后捕获后面所有连续的数字直到字符串结尾,适合对格式要求严格的场景。

另外补充个小技巧:如果是处理服务器上的完整文件路径,记得先用basename()把纯文件名提取出来(还能顺便去掉扩展名):

$filePath = "/var/www/uploads/doc-789.pdf";
$filename = basename($filePath, '.pdf'); // 得到 doc-789
// 再用上面的方法提取数字就行

内容的提问来源于stack exchange,提问作者Cray

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:03:36