当前位置: 首页 > 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 '身份证号无效';
}

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

http://www.lryc.cn/news/263285.html

相关文章:

  • Matlab示例-Examine 16-QAM Using MATLAB学习笔记
  • ArcGIS Pro SDK运行消息只提示一次
  • 通话状态监听-Android13
  • 无懈可击的防泄密之旅:迅软DSE在民营银行的成功实践
  • 【送书活动】智能汽车、自动驾驶、车联网的发展趋势和关键技术
  • 不同版本QT使用qmake时创建QML项目的区别
  • 【PHP入门】1.1-PHP初步语法
  • 如何在jenkins容器中安装python+httprunner+pytest+git+allure(一)
  • Android终端模拟器Termux上使用Ubuntu
  • 【神器】wakatime代码时间追踪工具
  • UML统一建模语言
  • Linux命令行控制小米电源开关
  • docker nginx 部署静态网站
  • uniapp之屏幕右侧出现滚动条去掉、隐藏、删除【好用!】
  • Linux 系统开机启动流程
  • vue2源码解析---watch和computed
  • 【云原生】华为云踩坑日志(更新于2023.12.10)
  • 计算机网络:自顶向下第八版学习指南笔记和课后实验--网络层(控制平面)
  • MFC 窗口创建过程与消息处理
  • 基于JavaWeb+SSM+Vue微信小程序的移动学习平台系统的设计和实现
  • 解决docker alpine /bin/sh: ./main: not found
  • 深入了解网络基础:从背景到协议
  • 针对这两个趋势,3.0全新新零售商业模式可以采取以下策略:
  • 鸿蒙HarmonyOS开发用什么语言
  • 气象数据预测分析与可视化:天气趋势预测揭秘
  • install cuda cudnn tersorRT
  • Vue 3 + Vite 4 移动端低版本白屏处理
  • Python爬虫-解决使用requests,Pyppeteer,Selenium遇到网站显示“您的连接不是私密连接”的问题|疑难杂症解决(2)
  • 机场信息集成系统系列介绍(5):机场运行资源管理系统
  • JavaEE:线程池精讲