当前位置: 首页 > news >正文

前端实用工具|JavaScript 身份证号合法性校验工具类全解析

本文通过原生 JavaScript 实现一个完整、严谨的身份证号校验函数,支持 15 位和 18 位身份证号的判断。校验内容涵盖:

  • 📌 格式校验:通过正则判断长度与基本结构;

  • 🗺️ 省份码校验:前两位数字是否为合法的行政区划代码;

  • /*** @description 校验身份证号是否合规(支持18位、15位)* @param {string | number} value 身份证号* @returns {boolean} true 合规;false 不合规*/
    export default function checkPsidno(value) {const psidno = String(value).trim().toUpperCase()// 1. 校验身份证号格式和长度(15位或18位)const regPsidno = /^(?:\d{15}|\d{17}[0-9X])$/if (!regPsidno.test(psidno)) return false// 2. 校验省份编码const validProvinces = {11: '北京', 12: '天津', 13: '河北', 14: '山西', 15: '内蒙古',21: '辽宁', 22: '吉林', 23: '黑龙江', 31: '上海', 32: '江苏',33: '浙江', 34: '安徽', 35: '福建', 36: '江西', 37: '山东',41: '河南', 42: '湖北', 43: '湖南', 44: '广东', 45: '广西',46: '海南', 50: '重庆', 51: '四川', 52: '贵州', 53: '云南',54: '西藏', 61: '陕西', 62: '甘肃', 63: '青海', 64: '宁夏',65: '新疆', 71: '台湾', 81: '香港', 82: '澳门', 91: '国外'}const provinceCode = Number(psidno.slice(0, 2))if (!validProvinces[provinceCode]) return false// 3. 校验出生日期是否有效const isValidBirthday = (year, month, day) => {const yyyy = Number(year)const mm = Number(month)const dd = Number(day)if (yyyy < 1800 || yyyy > new Date().getFullYear()) return falseif (mm < 1 || mm > 12) return falseconst date = new Date(yyyy, mm - 1, dd)if (date.getFullYear() !== yyyy ||date.getMonth() + 1 !== mm ||date.getDate() !== dd) return falseconst birthTime = date.getTime()const nowTime = Date.now()// 不允许出生日期晚于当前时间或年龄超过 150if (birthTime > nowTime || (new Date().getFullYear() - yyyy > 150)) return falsereturn true}if (psidno.length === 15) {// 15位转换为18位时补全年号const match = psidno.match(/^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/)if (!match) return falseconst year = Number(match[2]) > 20 ? '19' + match[2] : '20' + match[2]if (!isValidBirthday(year, match[3], match[4])) return false}if (psidno.length === 18) {const match = psidno.match(/^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9X])$/)if (!match) return falseif (!isValidBirthday(match[2], match[3], match[4])) return false// 4. 校验18位身份证最后一位校验码const weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]const checkCodes = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']const sum = psidno.slice(0, 17).split('').reduce((acc, cur, idx) => acc + Number(cur) * weights[idx], 0)const expectedCheckCode = checkCodes[sum % 11]if (expectedCheckCode !== psidno[17]) return false}return true
    }
    

    📆 出生日期校验:是否为合法的年月日,排除 2 月 30 日、4 月 31 日等非法日期;

  • 校验位校验(18位身份证):通过加权算法验证最后一位是否正确。

支持日常前端表单校验、Vue/React 表单校验规则集成,也适用于 Node.js 服务端初步过滤用户输入。

调用方式

import checkPsidno from './utils/checkPsidno' // 假设你将函数放在 utils 文件夹中const idNumber = '11010519491231002X'if (checkPsidno(idNumber)) {console.log('身份证号合法 ✅')
} else {console.log('身份证号不合法 ❌')
}

🧾 结语

本文分享了一个基于 JavaScript 编写的身份证号合法性校验工具类,支持 15 位与 18 位身份证号码校验,涵盖格式校验、出生日期验证、省份代码识别以及 18 位校验位的精确计算,实用性强,适合在前端表单验证等多个场景中复用。

希望这个工具类能帮你节省不少重复开发时间。如果你在使用过程中有更好的优化建议,或者希望我继续分享更多表单校验类工具,欢迎评论交流 👇!

如果觉得有用,点个 ⭐️ 收藏不迷路~

http://www.xdnf.cn/news/434521.html

相关文章:

  • openFeign远程调用
  • 需求跟踪矩阵准确性的5大策略
  • 基于vllm-ascend的华为atlas大模型部署
  • OrangePi Zero 3学习笔记(Android篇)8 - OpenOCD
  • 什么是原码和补码
  • 【JavaScript】JavaScript实现大数相乘
  • ebook2audiobook开源程序使用动态 AI 模型和语音克隆将电子书转换为带有章节和元数据的有声读物。支持 1,107+ 种语言
  • day013-软件包管理-实战
  • 门禁人脸识别系统详细技术文档
  • 索尼(sony)摄像机格式化后mp4的恢复方法
  • 【基础】Windows开发设置入门2:Windows 终端Windows Terminal
  • FHQ平衡树
  • MCP Server多节点滚动升级一致性治理
  • 怎样将课程表导入手机日历,每天提醒上课?
  • 【Linux系列】dd 命令的深度解析与应用实践
  • Spring框架请求注解
  • 从生产流程到故障处理,R²AIN SUITE 如何为制造业“减负”?
  • Transformer架构介绍+从零搭建预训练模型项目
  • ai讲ping
  • 【C盘空间不足怎么办】
  • git merge和git rebase
  • 科学养生:构建现代健康生活新范式
  • LamaIndex rag(增强检索)入门
  • MySQL:关系模型的基本理论
  • 以价值为导向的精准数据治理实践,赋能业务决策
  • 基于STM32、HAL库的SGTL5000XNLA3R2音频接口芯片驱动程序设计
  • 数据库--处理模型(Processing Model)
  • DCDC输入4.5V-65V耐压 5A电流异步降压芯片SL3075兼容替换TPS54560
  • 【蓝桥杯嵌入式】【复盘】第13届国赛真题
  • 微店根据关键词取商品列表 API 返回值说明