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

【PHP】身份证正则验证、校验位验证

目录

1.正则

简单正则

详细正则

2.校验位验证


1.正则


  • 简单正则
function isValidIdCardNumber($idCardNumber) {// 身份证号长度为 15 位或 18 位$pattern = '/^(?:\d{15}|\d{17}[\dxX])$/';return preg_match($pattern, $idCardNumber);
}$idCardNumber = '123456789012345678'; // 示例身份证号if (isValidIdCardNumber($idCardNumber)) {echo '身份证号有效';
} else {echo '身份证号无效';
}

这个正则表达式会匹配 15 位数字的身份证号(例如:123456789012345)或 18 位数字加一个校验位(例如:123456789012345678X123456789012345678x)的身份证号。请注意,这个正则表达式并不会验证校验位是否正确,只会检查身份证号的长度和格式。

  • 详细正则
$idcard = '123456789012345678';
$idcard = strtoupper($idcard); // 转成大写
$reg = '/^[1-9]\d{5}(19|20|21)\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/';
if (!preg_match($reg, $idcard)) {return false;
}
return true;

这个正则表达式用于验证中国大陆的身份证号。它的结构如下:

  1. /^:表示正则表达式的开始。
  2. [1-9]:第一位必须是 1-9 之间的数字。
  3. \d{5}:接下来的 5 位是任意数字。
  4. (19|20|21):接下来的 2 位可以是 "19"、"20" 或 "21" 之间的数字。
  5. \d{2}:接下来的 2 位是任意数字。
  6. ((0[1-9])|(10|11|12)):接下来的 2 位表示月份,可以是 "01" 到 "09" 或 "10" 到 "12" 之间的数字。
  7. (([0-2][1-9])|10|20|30|31):接下来的 2 位表示日期,可以是 "01" 到 "29" 之间的数字,或者 "30" 到 "31" 之间的数字(根据月份和闰年的不同而变化)。
  8. \d{3}:接下来的 3 位是任意数字。
  9. [0-9Xx]:最后一位可以是数字 0-9 或字母 X(大小写均可)。
  10. $:表示正则表达式的结束。

这个正则表达式用于验证身份证号的格式是否正确。然而,它并不会验证校验位是否正确。

2.校验位验证


 以下是一个使用 PHP 验证中国大陆身份证号校验位是否正确的示例:

function isValidIdCardNumber($idCardNumber) {// 身份证号长度为 15 位或 18 位$pattern = '/^(?:\d{15}|\d{17}[\dxX])$/';if (!preg_match($pattern, $idCardNumber)) {return false;}// 15 位身份证号转换为 18 位if (strlen($idCardNumber) === 15) {$idCardNumber = substr($idCardNumber, 0, 6) . '19' . substr($idCardNumber, 6, 9);}// 计算校验位$weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];$checkCodes = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];$sum = 0;for ($i = 0; $i < 17; $i++) {$sum += $weights[$i] * (int) $idCardNumber[$i];}$checkCodeIndex = $sum % 11;// 验证校验位$lastChar = strtoupper($idCardNumber[17]);return $lastChar === $checkCodes[$checkCodeIndex];
}$idCardNumber = '123456789012345678'; // 示例身份证号if (isValidIdCardNumber($idCardNumber)) {echo '身份证号有效';
} else {echo '身份证号无效';
}

这个示例首先使用正则表达式验证身份证号的格式。如果身份证号格式正确,它会继续计算校验位。如果校验位与身份证号中的最后一位字符相符,那么身份证号被认为是有效的。

相关文章:

  • 如何让.NET应用使用更大的内存
  • 数据结构:图文详解 队列 | 循环队列 的各种操作(出队,入队,获取队列元素,判断队列状态)
  • 计算机网络2
  • Excel怎样统计一列中不同的数据分别有多少个?
  • 【影像组学入门百问】#29---#31
  • 云服务器初次连接宝塔,连接不上
  • 基于QTreeWidget实现多级组织结构
  • 设计模式详解---模板方法模式
  • Python爬虫之两种urlencode编码发起post请求方式
  • Qt-QTransform介绍与使用
  • 机器学习算法---回归
  • Linux Java Jar Shell 脚本
  • 使用 React 实现自定义数据展示日历组件
  • 《Linux C编程实战》笔记:进程操作之退出,执行,等待
  • SQL进阶理论篇(十二):InnoDB中的MVCC是如何实现的?
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • echarts花样作死的坑
  • Electron入门介绍
  • ESLint简单操作
  • Git的一些常用操作
  • JSONP原理
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • Python爬虫--- 1.3 BS4库的解析器
  • session共享问题解决方案
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 前端设计模式
  • 三栏布局总结
  • 王永庆:技术创新改变教育未来
  • 小程序button引导用户授权
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • 阿里云移动端播放器高级功能介绍
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (1)虚拟机的安装与使用,linux系统安装
  • (第27天)Oracle 数据泵转换分区表
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (六)Hibernate的二级缓存
  • (七)Knockout 创建自定义绑定
  • (转)http协议
  • .NET 药厂业务系统 CPU爆高分析
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
  • .NET开发不可不知、不可不用的辅助类(一)
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • :=
  • @AutoConfigurationPackage的使用
  • @GetMapping和@RequestMapping的区别
  • [ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2019-6116
  • [ vulhub漏洞复现篇 ] struts2远程代码执行漏洞 S2-005 (CVE-2010-1870)
  • []Telit UC864E 拨号上网
  • [100天算法】-二叉树剪枝(day 48)
  • [20150321]索引空块的问题.txt
  • [BZOJ1178][Apio2009]CONVENTION会议中心
  • [CakePHP] 在Controller中使用Helper
  • [CentOs7]iptables防火墙安装与设置