php校验文件类型不能只靠正则,需结合后缀白名单与finfo_file()等真实mime验证;常见图片扩展名正则为/\.(jpg|jpeg|png|gif|webp)$/i,严格模式应先用pathinfo提取并转小写再匹配 /^[a-z0-9]{2,5}$/ 且查白名单。

PHP中校验文件类型不能只靠正则表达式,因为扩展名可被轻易伪造。但结合后缀白名单与正则匹配,仍是前端/初筛环节常用且有效的辅助手段。关键在于:正则只管“看起来像什么”,真实类型必须用 mime_content_type()、finfo_file() 或扩展名+内容头双重验证。
校验常见图片扩展名
适用于上传表单中对 $_FILES['file']['name'] 的初步过滤,只允许 .jpg/.jpeg/.png/.gif/.webp:
- 正则模式:
/\.(jpg|jpeg|png|gif|webp)$/i - 说明:以点号开头,结尾匹配指定后缀,
i修饰符忽略大小写 - 使用示例:
php
$filename = 'avatar.JPG';
if (preg_match('/\.(jpg|jpeg|png|gif|webp)$/i', $filename)) {
echo '扩展名合法';
} else {
echo '不支持的文件类型';
}
?>
限制纯字母数字扩展名(更严格)
防止形如 .php.jpg 或带空格/控制字符的恶意命名,要求扩展名仅含小写字母和数字,长度 2–5 位:
- 正则模式:
/\.([a-z0-9]{2,5})$/i - 注意:需配合
pathinfo($filename, PATHINFO_EXTENSION)提取扩展名后再匹配,避免路径干扰 - 推荐写法:
$ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
if ($ext && preg_match('/^[a-z0-9]{2,5}$/', $ext) && in_array($ext, ['jpg','png','pdf','txt'])) { /* 白名单二次确认 */ }
排除危险扩展名(黑名单思路,慎用)
不推荐单独依赖黑名单,但可在日志或调试阶段快速识别高危后缀:
- 正则模式:
/\.(php|phtml|php3|php4|php5|phar|sh|pl|py|exe|bat|cmd)$/i - 风险:攻击者可能绕过(如
shell.php.jpg或利用 Nginx 配置漏洞解析) - 正确做法:提取扩展名 → 转小写 → 查白名单 → 再用
finfo_open()检查真实 MIME 类型
校验带版本号的现代格式(如 .svgz、.woff2)
适配 Web 字体、矢量图标等新型资源,支持可选数字或字母后缀:
- 正则模式:
/\.(svgz?|woff2?|ttf|eot|mp4|webm|avif)$/i - 说明:
z?表示 z 可有可无(.svg / .svgz),2?同理(.woff / .woff2) - 建议搭配 MIME 白名单,例如:
['image/svg+xml', 'font/woff2', 'video/mp4']
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











