必须先校验文件名是否为空或纯点号再提取后缀:用trim()去空格后检查长度为0,或删掉所有点号后剩余为空;否则pathinfo()等函数会返回null或空字符串,导致strtolower()等操作触发警告。

当PHP代码用pathinfo()或substr(strrchr())提取文件后缀时,若传入空字符串或仅含点号的文件名(如""、"."、".."),会返回意外结果甚至触发警告——必须在获取后缀前主动拦截这类异常输入。
先判断文件名是否为空或仅含点号
第一步:用trim()去除首尾空白,再用strlen()检查长度是否为0。
第二步:用str_replace()把点号全删掉,再判断剩余字符串是否为空——如果删完只剩点号,说明原字符串是"."或".."或"..."这类无效名。
第三步:合并判断逻辑,写成一行防御式条件:if (strlen(trim($filename)) === 0 || trim(str_replace('.', '', $filename)) === '') { return false; }。这一步必须放在任何后缀提取操作之前,否则pathinfo($filename, PATHINFO_EXTENSION)对"."会返回空字符串,对""会返回null,后续strtolower()等操作可能报Warning: strtolower() expects parameter 1 to be string。
用pathinfo安全提取扩展名
方法一:直接调用pathinfo($filename, PATHINFO_EXTENSION),但【必须确保$filename非空且不为纯点号】,否则返回值不可靠。
方法二:加一层空值过滤,写成$ext = pathinfo($filename, PATHINFO_EXTENSION) ?: '';。注意这个?:只捕获false和null,对0或'0'也会返回空字符串,所以仅适用于已确认输入为合法文件名的场景。
用正则匹配后缀并排除边界情况
写正则/\.([a-zA-Z0-9]+)$/,用preg_match()捕获最后一段字母数字组合。
但【正则必须配合前置校验】:如果$filename是"file.",该正则会匹配失败,返回0;如果是"file..txt",会错误地匹配到"txt"——这不符合真实后缀逻辑,需额外用strrpos($filename, '.')确认最后一个点号后面还有内容且不为空。
完整写法:$lastDot = strrpos($filename, '.'); if ($lastDot !== false && $lastDot
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











