// 前端
const re = /^1[3-9]\d{9}$/;
// PHP 后端
preg_match('/^1[3-9]\d{9}$/', $phone);
前端把手机号放宽到 11 位,输入 13800138000 显示绿色对勾。点提交后接口回 422,提示 phone 格式不正确,用户来回改了四遍还是过不去。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。
追下去是这么回事:前端和后端各自维护了一份正则,前端改成了十一位,接口里还是十位的旧规则。两边没有共用同一处校验定义,谁先改谁就先把用户挡在门外。
围绕「前后端校验规则」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。
处理上按这个顺序:把前后端两份正则贴在一起逐字符比对,找出位数和号段的差异;把规则收敛到接口文档里的同一份定义,前端按它生成校验;后端返回字段级错误码和期望格式,别只丢一句格式不正确。
确认没问题再收工,同一批手机号分别跑前端校验和接口,结论一致,正常号码提交不再出现 422。
