严格身份证校验需js实现:先用pattern做基础正则筛选,再于blur时检查18位长度、行政区划、真实出生日期及加权校验码;输入前清理空格短横线,数字转换用parseint,末位x不区分大小写,后端必须复核。

HTML 本身不能做严格校验,真正有效的身份证格式验证必须靠 JavaScript 实现。原生 pattern 属性仅能做基础正则匹配,拦不住格式看似正确但实际无效的号码(比如年份为 20260230、地区码不存在、校验位错误等)。严格校验需同时满足:18 位长度、前两位属有效行政区划、出生日期真实存在、加权求和后校验码准确。
用正则先筛掉明显非法输入
在 input 标签中添加 pattern 和 title,作为用户友好的第一道提示:
- 写法示例:
<input type="text" pattern="^[1-9]\d{5}(19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$" title="请输入正确的18位身份证号"> - 这个正则覆盖了:非零开头的6位地址码、19/20 开头的4位年份、合法月日范围(但不校验闰年或每月天数细节)、末位为数字或 X
- 它不处理:2月30日、地区码 99、校验码计算、15位旧号(当前业务可拒绝)
用 JavaScript 在失焦时执行完整逻辑校验
监听 blur 事件,在用户离开输入框时运行校验函数,避免 oninput 频繁触发影响体验:
- 先检查长度是否为 18 位,且前 17 位全为数字,第 18 位是
0-9或X/x - 查行政区划表(如
{11:"北京",12:"天津",...}),取前两位判断是否属于已知省市 - 提取第 7–14 位,尝试解析为日期(如
20000101 → new Date(2000,0,1)),再比对年月日是否与原始字符串一致(防 20230230 这类假日期) - 按加权因子
[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]计算前 17 位加权和,对 11 取模,对照校验码表['1','0','X','9','8','7','6','5','4','3','2']判定末位是否正确
补充实用细节
让校验更健壮、更贴近真实场景:
- 输入框建议加上
inputmode="numeric"和maxlength="18",防止粘贴超长内容或误触字母键 - 用户输入含空格、短横线、中文字符时,应在校验前用
.replace(/[\s\- —]/g, '')清理 - 所有数字运算前必须用
parseInt(str, 10)转换,避免字符串隐式相乘出错 - 末位校验码比对要忽略大小写:
id[17].toUpperCase() === checkCode[sum % 11].toUpperCase() - 后端必须重复执行相同校验——前端 JS 可被禁用或绕过,不可信任
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











