php中提取非隐藏文件后缀应使用正则/^(1.*.)+(.+)$/匹配,确保首字符非点且捕获最后一个点后内容,如test.php→php;推荐pathinfo(pathinfo_extension)处理.tar.gz等复合后缀更可靠。. ↩

在PHP中处理文件列表时,需要从文件名中提取后缀但跳过以点开头的隐藏文件(如 .gitignore、.env),同时避免把 .tar.gz 这类复合后缀错误截断为 .gz。
用 preg_match 提取非隐藏文件的合法后缀
第一步:用正则匹配不以点开头、且含至少一个点的文件名,捕获最后一个点后的部分。
preg_match('/^[^\.].*\.(.+)$/', $filename, $matches);
这个正则开头的 【^[^\.]】 确保第一个字符不是点,排除 .git、.DS_Store 等;【.*\.(.+)】 贪婪匹配到最后一个点,避免把 archive.tar.gz 的后缀错提成 gz。
如果匹配成功,$matches[1] 就是所需后缀,比如 test.php → php,data.json → json。
用 preg_replace 批量过滤并提取
方法一:先剔除隐藏文件,再统一提取后缀
$files = array_filter($file_list, function($f) { return $f[0] !== '.'; });
array_map(function($f) { return pathinfo($f, PATHINFO_EXTENSION); }, $files);
注意:pathinfo 不依赖正则,对 .tar.bz2 返回 tar.bz2,比单纯用点分割更可靠。
方法二:单次正则完成过滤+提取(适合 foreach 场景)
if (preg_match('/^[^\.].*\.(.+)$/', $filename, $m)) { $ext = $m[1]; } else { $ext = ''; }
这一步操作起来很简单,直接把正则放进 if 判断里就行,不需要额外判断空数组或 false。
规避常见陷阱的写法
① 不要用 /.*\.(.*)$/ —— 它会匹配 .htaccess 并返回 htaccess,完全没排除隐藏文件。
② 不要写成 /[^\.]+\.(.+)$/ —— 这个正则在 filename 是 a.b.c.d 时会捕获 b.c.d,而非 d。
③ 正确写法必须包含行首锚定 ^ 和非点首字符约束,否则 /^.*\.(.+)$/ 在 .config.yml 上也会命中,$m[1] 得到 config.yml。
最终结果存入变量即可,无需额外 trim 或 strtolower 处理,除非业务明确要求统一小写。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











