h5页面身份证原生校验需完整执行gb 11643-1999四层逻辑:1.长度与字符格式检查;2.出生日期真实性验证;3.第18位校验码计算比对;4.地址码基础合理性检查。

在 H5 页面中,利用原生能力做身份证校验,不能只靠 <input type="text" pattern="..."> 这类简单正则——它只能做格式初筛,无法覆盖出生日期合法性、行政区划有效性、校验码计算等关键维度。真正靠谱的“原生校验”,是指在浏览器端(不依赖后端)用 JavaScript 完整执行国家标准 GB 11643-1999 规定的四层验证逻辑。
第一步:严格长度与字符格式检查
这是所有后续校验的前提,必须最先执行:
- 字符串长度必须恰好为 18 位
- 前 17 位必须全是阿拉伯数字(
'0'–'9') - 第 18 位只能是数字
'0'–'9'或大写/小写'X'/'x'
示例代码片段:
if (id.length !== 18) return false;if (!/^[1-9]\d{5}(19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]$/.test(id)) return false;
第二步:验证出生日期是否真实存在
正则无法判断“20000230”或“19990229”是否合法——前者二月无30日,后者不是闰年。必须解析年月日并调用 Date API 校验:
- 提取第 7–14 位作为 YYYYMMDD 字符串
- 构造
new Date(year, month - 1, day),注意月份从 0 开始 - 比对生成的 Date 对象的
getFullYear()、getMonth()、getDate()是否与输入完全一致(防止自动进位,如 20230230 → 2023-03-02)
例如:new Date(2000, 1, 30) 实际得到的是 2000-03-01,说明 20000230 无效。
第三步:校验第 18 位校验码(核心算法)
这是国家标准强制要求的数学校验,不可跳过。步骤如下:
- 取前 17 位,逐位转为数字
- 分别乘以加权系数:
[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2] - 求和后对 11 取模,得到余数
0–10 - 查表映射:余数
0→'1'、1→'0'、2→'X'、3→'9'…10→'2' - 将结果与第 18 位(统一转大写)比对
注意:X 是罗马数字 10 的占位符,不是字母;大小写需统一处理。
第四步:可选但推荐——地址码基础合理性检查
虽然国标未强制要求实时校验行政区划代码有效性(因历史发证代码可能已废止),但可做轻量级过滤:
- 检查前两位是否属于有效省份编码(如
11北京、31上海、44广东等) - 排除明显非法组合,如
00xxxx、99xxxx等非标准开头 - 无需联网查库,用一个 34 项的静态数组即可覆盖全部省级单位
这能拦截一批伪造号码,提升前端体验,且不增加额外请求。











