如何在PHP中提取不含后缀的文件名?字符串含未知数量斜杠
嘿,这个问题其实在PHP里有好几种简洁的解决办法,不用纠结手动处理斜杠的麻烦,我给你列几个实用的方案:
方案1:用
pathinfo()(最推荐,最简洁) 这个函数专门用来解析路径信息,直接就能拿到不带扩展名的文件名,完全不用管前面有多少斜杠:
$str = "abc/def/ghi/name.extension"; $filename = pathinfo($str, PATHINFO_FILENAME); echo $filename; // 输出 name
解释:pathinfo()会自动处理路径中的分隔符(不管是/还是\),PATHINFO_FILENAME常量指定返回不带扩展名的文件名部分,完美匹配你的需求,就算文件名里有多个点(比如name.v1.ext)也能正确提取名称部分。
方案2:结合
basename()和explode() 如果你习惯用basename()先拿到路径的最后一段(带扩展名的文件名),再拆分扩展名:
$str = "abc/def/ghi/name.extension"; $fullFilename = basename($str); // 得到 name.extension list($name) = explode('.', $fullFilename, 2); // 只拆分第一个点 echo $name; // 输出 name
解释:basename()直接返回路径最后一个斜杠后的内容,explode('.', ..., 2)的第三个参数限制只拆分一次,这样就算文件名里包含多个点,也只会拿到第一个点之前的部分,避免出错。
方案3:手动字符串截取(适合理解底层逻辑)
如果你想自己手动处理字符串位置,可以用strrpos()找到最后一个斜杠和最后一个点的位置,再用substr()截取:
$str = "abc/def/ghi/name.extension"; // 找到最后一个斜杠的位置,加1是为了跳过斜杠本身 $lastSlashPos = strrpos($str, '/') + 1; // 找到最后一个点的位置 $lastDotPos = strrpos($str, '.'); // 从斜杠后开始,截取到点之前的部分 $name = substr($str, $lastSlashPos, $lastDotPos - $lastSlashPos); echo $name; // 输出 name
解释:strrpos()返回指定字符最后一次出现的位置,通过计算起始位置和截取长度就能精准拿到目标内容。不过这种方法需要额外处理边界情况(比如字符串没有斜杠或者没有点的情况),所以更推荐前两种方案。
内容的提问来源于stack exchange,提问作者user2037412
相关产品推荐
相关产品推荐

