海外用户填 +86 13800138000,输入框立刻变红,提示手机号格式不正确。把加号去掉能过,但用户不知道自己该不该带区号。乍看像缓存或者权限的锅,追下去往往不是。
const digits = phone.replace(/[^\d+]/g, '');
const e164 = /^\+[1-9]\d{7,14}$/.test(digits);
if (!e164) showError('请带国家区号,例如 +8613800138000');
追下去是这么回事:正则只按国内 11 位号码写死,加号、空格、括号一律不认。区号和国家长度没有建模,前端默认所有人都是同一套格式。
「国际手机号校验」这类改动最怕改一半,回滚脚本先准备好,再动生产。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。
线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。
具体做法是,先按国家选择器确定区号,再把本地号码单独校验长度;输入时允许空格和横线,提交前去掉非数字字符并保留开头的加号;服务端按 E.164 存储,展示时再按国家格式化。
验收就看一点,填 +86 13800138000 和 +1 4155550132 都能通过,库里存的是标准 E.164 格式。
