身份证号正则校验仅能判断格式是否合规,不能验证真实性、日期有效性或校验位正确性;推荐使用严格正则/^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]$/,它限制首位非0、年份1800–2099、月日合法且末位支持X/x,但线上必须配合后端权威核验。

直接用正则校验身份证号格式,但别只信正则
正则只能判断字符串“长得像不像”身份证号,不能验证是否真实有效、日期是否合法、校验位是否正确。线上项目必须配合后端核验,前端正则仅作第一道快速拦截。
推荐用这个更严谨的正则:/^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}(\d|[Xx])$/。它比简单匹配15/18位更严格,强制要求:
- 开头非0(排除
012345678901234567这类假号) - 年份限定在1800–2099之间
- 月份和日期符合实际日历(如不会出现
20230230) - 末位支持
X或x(国标要求)
uni-app里怎么写校验逻辑(带提示)
在页面的 methods 或组合式 API 的 setup 中调用即可,注意结合 uni.showToast 给用户明确反馈:
function validateIdCard(idCard) {
if (!idCard || !idCard.trim()) return false
const reg = /^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}(\d|[Xx])$/
return reg.test(idCard.trim())
}
// 调用示例(比如提交时)
onSubmit() {
if (!this.idCard) {
uni.showToast({ title: '请输入身份证号', icon: 'none' })
return
}
if (!validateIdCard(this.idCard)) {
uni.showToast({ title: '身份证号格式不正确', icon: 'none' })
return
}
// 继续提交...
}
为什么不能只靠前端正则?这几个坑很常见
很多开发者卡在这里:正则通过了,但后端返回“证件不存在”或“姓名与身份证不匹配”。原因包括:
-
11010119900307299X这类号能过正则,但可能是虚构号段(如北京东城110101开头,但90年代发证量极少) - 末位校验算法(ISO 7064:1983 MOD 11-2)没在前端实现,
110101199003072990就是错的,但正则会放行 - 港澳台居住证、外国人永久居留身份证等新型证件,不满足大陆身份证正则规则
- 用户手误输错一位(比如把
X打成0),正则无法识别语义错误
真正要上线,还得加一步后端核验
前端正则只是“预筛”,最终必须走权威渠道验证。常见方案有:
- 调用公安部门接口(需资质,如银行/政务类App)
- 对接阿里云/腾讯云/百度智能云的实名认证API(传
name+idCard,返回是否一致) - 使用OCR识别+活体检测SDK(如
@dcloudio/uni-aliyun-verify),自动完成证件真伪+人证合一判断
特别注意:如果用百度OCR,得先上传图片获取信息,再拿识别出的idCard去比对用户输入——这步容易漏,导致“用户输错,OCR却识别对了,结果比对失败”。











