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
相关产品推荐
相关产品推荐

