php中用mb_substr提取中文文件名后缀需先用mb_strrpos定位最后一个点号,再用mb_substr截取;若无点号则无后缀;提取后须trim去空格并用正则验证合法性,禁用已废弃的mb_split。

PHP中用mb_substr提取中文文件名后缀时,必须先正确识别文件名的编码和点号位置,否则会截断乱码或漏掉最后一个字符。
确认文件名编码并定位最后一个点号
用mb_strrpos($filename, '.', 'UTF-8')获取最后一个点号的位置,不能用strpos或strrpos——它们按字节计算,对中文会错位。
如果返回false,说明文件名不含点号,此时整个字符串就是文件名主体,无后缀可提。
用mb_substr安全截取后缀
方法一:直接截取点号之后全部内容
$ext = mb_substr($filename, mb_strrpos($filename, '.') + 1, null, 'UTF-8');
方法二:先用mb_strrchr获取点号及之后部分,再用mb_substr去掉点号
$with_dot = mb_strrchr($filename, '.', true, 'UTF-8');
$ext = $with_dot ? mb_substr($with_dot, 1, null, 'UTF-8') : '';
方法三:用mb_split分割再取最后一段(仅适用于简单场景)
$parts = mb_split('\.', $filename, 'UTF-8');
$ext = !empty($parts) ? end($parts) : '';
【注意:mb_split在PHP 8.0+已被废弃,生产环境禁用】
验证后缀是否合法并过滤空格
第一步:用trim($ext)清除首尾空白,中文文件名常带不可见全角空格。
第二步:用mb_ereg_match('^[a-zA-Z0-9\u4e00-\u9fa5]+$', $ext)粗筛——只允许字母、数字、汉字;若业务需支持下划线或短横线,把正则改成'^[a-zA-Z0-9_\u4e00-\u9fa5\-]+$'。
第三步:拒绝空后缀或纯点号后缀,即if (empty($ext) || $ext === '.') { $ext = ''; }。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











