substr与strrpos组合是php中提取文件后缀最轻量高效的方式:先用strrpos定位最后一个点的位置,再用substr从该位置+1截取至末尾;需判断strrpos返回值避免错误,并推荐先存位置变量再复用以提升性能。

当你需要在PHP中快速提取文件名后缀,又不想调用pathinfo这种开销稍大的函数时,substr和strrpos组合是最轻量、执行最快的方式——它不生成数组、不解析完整路径,只定位最后一个点并截取其后内容。
核心逻辑:找最后一个点,切出后面全部
第一步:用strrpos($filename, '.')找到文件名中【最后一个点的字节位置】,不是第一个,也不是任意一个,必须是最后一个;如果文件名不含点(如"README"),strrpos会返回false,后续substr会报错或返回空字符串,这点必须提前判断。
第二步:将strrpos的结果加1作为substr的起始偏移量,即从点之后第一个字符开始截取。
第三步:substr第三个参数留空,表示截取到字符串末尾——不需要计算长度,避免strlen冗余调用。
一行写法(推荐直接复制)
$ext = strrpos($filename, '.') ? substr($filename, strrpos($filename, '.') + 1) : '';
这行代码把两次strrpos调用合并了,但注意:它会重复执行strrpos两次,对性能敏感场景不建议;实际项目中应先存结果再复用。
安全写法(带判空与小写转换)
方法一:基础健壮版
$pos = strrpos($filename, '.');
$ext = $pos !== false ? strtolower(substr($filename, $pos + 1)) : '';
方法二:兼容无扩展名+含路径场景
$basename = basename($filename);
$pos = strrpos($basename, '.');
$ext = $pos !== false && $pos > 0 ? strtolower(substr($basename, $pos + 1)) : '';
【这里加了$pos > 0判断,排除".gitignore"开头的隐藏文件被误判为后缀为空】











