PHP实现可精确验证身份证号码的工具类示例


Posted in PHP onMay 31, 2018

本文实例讲述了PHP实现可精确验证身份证号码的工具类。分享给大家供大家参考,具体如下:

<?php
class check_IdCard {
 // $num为身份证号码,$checkSex:1为男,2为女,不输入为不验证
 public function checkIdentity($num, $checkSex = '') { // 不是15位或不是18位都是无效身份证号
 if (strlen($num) != 15 && strlen($num) != 18) {
  return false;
 }
 // 是数值
 if (is_numeric($num)) {
  // 如果是15位身份证号
  if (strlen($num) == 15) {
  // 省市县(6位)
  $areaNum = substr($num, 0, 6);
  // 出生年月(6位)
  $dateNum = substr($num, 6, 6);
  // 性别(3位)
  $sexNum = substr($num, 12, 3);
  } else {
  // 如果是18位身份证号
  // 省市县(6位)
  $areaNum = substr($num, 0, 6);
  // 出生年月(8位)
  $dateNum = substr($num, 6, 8);
  // 性别(3位)
  $sexNum = substr($num, 14, 3);
  // 校验码(1位)
  $endNum = substr($num, 17, 1);
  }
 } else {
  // 不是数值
  if (strlen($num) == 15) {
  return false;
  } else {
  //验证前17位为数值,且18位为字符x
  $check17 = substr($num, 0, 17);
  if (!is_numeric($check17)) {
   return false;
  }
  //省市县(6位)
  $areaNum = substr($num, 0, 6);
  // 出生年月(8位)
  $dateNum = substr($num, 6, 8);
  // 性别(3位)
  $sexNum = substr($num, 14, 3);
  // 校验码(1位)
  $endNum = substr($num, 17, 1);
  if ($endNum != 'x' && $endNum != 'X') {
   return false;
  }
  }
 }
 //验证地区
 if (isset($areaNum)) {
  if (!$this->checkArea($areaNum)) {
  return false;
  }
 }
 //验证日期
 if (isset($dateNum)) {
  if (!$this->checkDate($dateNum)) {
  return false;
  }
 }
 // 性别1为男,2为女
 if ($checkSex == 1) {
  if (isset($sexNum)) {
  if (!$this->checkSex($sexNum)) {
   return false;
  }
  }
 } elseif ($checkSex == 2) {
  if (isset($sexNum)) {
  if ($this->checkSex($sexNum)) {
   return false;
  }
  }
 }
 //验证最后一位
 if (isset($endNum)) {
  if (!$this->checkEnd($endNum, $num)) {
  return false;
  }
 }
 return true;
 }
 // 验证城市
 private function checkArea($area) {
 $num1 = substr($area, 0, 2);
 $num2 = substr($area, 2, 2);
 $num3 = substr($area, 4, 2);
 // 根据GB/T2260—999,省市代码11到65
 if (10 < $num1 && $num1 < 66) {
  return true;
 } else {
  return false;
 }
 }
 // 验证出生日期
 private function checkDate($date) {
 if (strlen($date) == 6) {
  $date1 = substr($date, 0, 2);
  $date2 = substr($date, 2, 2);
  $date3 = substr($date, 4, 2);
  $statusY = $this->checkY('19' . $date1);
 } else {
  $date1 = substr($date, 0, 4);
  $date2 = substr($date, 4, 2);
  $date3 = substr($date, 6, 2);
  $nowY = date("Y", time());
  if (1900 < $date1 && $date1 <= $nowY) {
  $statusY = $this->checkY($date1);
  } else {
  return false;
  }
 }
 if (0 < $date2 && $date2 < 13) {
  if ($date2 == 2) {
  // 润年
  if ($statusY) {
   if (0 < $date3 && $date3 <= 29) {
   return true;
   } else {
   return false;
   }
  } else {
   // 平年
   if (0 < $date3 && $date3 <= 28) {
   return true;
   } else {
   return false;
   }
  }
  } else {
  $maxDateNum = $this->getDateNum($date2);
  if (0 < $date3 && $date3 <= $maxDateNum) {
   return true;
  } else {
   return false;
  }
  }
 } else {
  return false;
 }
 }
 // 验证性别
 private function checkSex($sex) {
 if ($sex % 2 == 0) {
  return false;
 } else {
  return true;
 }
 }
 // 验证18位身份证最后一位
 private function checkEnd($end, $num) {
 $checkHou = array(1, 0, 'x', 9, 8, 7, 6, 5, 4, 3, 2);
 $checkGu = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
 $sum = 0;
 for ($i = 0;$i < 17;$i++) {
  $sum+= (int)$checkGu[$i] * (int)$num[$i];
 }
 $checkHouParameter = $sum % 11;
 if ($checkHou[$checkHouParameter] != $num[17]) {
  return false;
 } else {
  return true;
 }
 }
 // 验证平年润年,参数年份,返回 true为润年 false为平年
 private function checkY($Y) {
 if (getType($Y) == 'string') {
  $Y = (int)$Y;
 }
 if ($Y % 100 == 0) {
  if ($Y % 400 == 0) {
  return true;
  } else {
  return false;
  }
 } else if ($Y % 4 == 0) {
  return true;
 } else {
  return false;
 }
 }
 // 当月天数 参数月份(不包括2月) 返回天数
 private function getDateNum($month) {
 if ($month == 1 || $month == 3 || $month == 5 || $month == 7 || $month == 8 || $month == 10 || $month == 12) {
  return 31;
 } else if ($month == 2) {
 } else {
  return 30;
 }
 }
}
// 测试
header("content-type:text/html;charset=utf-8");
$num = '230106199202099035'; //此号码为随机生成
$test = new check_IdCard();
$data = $test->checkIdentity($num);
var_dump($data);
//=============新的18位身份证号码各位的含义:=======================
//1-2位省、自治区、直辖市代码;11-65
//3-4位地级市、盟、自治州代码;
//5-6位县、县级市、区代码;
//7-14位出生年月日,比如19670401代表1967年4月1日;
//15-17位为顺序号,其中17位男为单数,女为双数;
//18位为校验码,0-9和X,由公式随机产生。
//举例:
//130503 19670401 0012这个身份证号的含义: 13为河北,05为邢台,03为桥西区,出生日期为1967年4月1日,顺序号为001,2为验证码
//===========15位身份证号码各位的含义:=======================
//1-2位省、自治区、直辖市代码;
//3-4位地级市、盟、自治州代码;
//5-6位县、县级市、区代码;
//7-12位出生年月日,比如670401代表1967年4月1日,这是和18位号码的第一个区别;
//13-15位为顺序号,其中15位男为单数,女为双数;
//与18位身份证号的第二个区别:没有最后一位的验证码。
//举例:
//130503 670401 001的含义; 13为河北,05为邢台,03为桥西区,出生日期为1967年4月1日,顺序号为001。

运行结果:

bool(true)

PHP 相关文章推荐
PHP脚本的10个技巧(5)
Oct 09 PHP
PHP 选项及相关信息函数库
Dec 04 PHP
ThinkPHP查询返回简单字段数组的方法
Aug 25 PHP
PHP+jQuery 注册模块开发详解
Oct 14 PHP
php命令行(cli)模式下报require 加载路径错误的解决方法
Nov 23 PHP
yii2使用ajax返回json的实现方法
May 14 PHP
thinkPHP中配置的读取与C方法详解
Dec 05 PHP
PHP实现的简单AES加密解密算法实例
May 29 PHP
php 算法之实现相对路径的实例
Oct 17 PHP
Laravel框架在本地虚拟机快速安装的方法详解
Jun 11 PHP
PHP getNamespaces()函数讲解
Feb 03 PHP
PHP实现将上传图片自动缩放到指定分辨率,并保持清晰度封装类示例
Jun 17 PHP
JSON PHP中,Json字符串反序列化成对象/数组的方法
May 31 #PHP
php curl获取到json对象并转成数组array的方法
May 31 #PHP
php插入mysql数据返回id的方法
May 31 #PHP
PHP给前端返回一个JSON对象的实例讲解
May 31 #PHP
PHP实现上传图片到数据库并显示输出的方法
May 31 #PHP
php 获取xml接口数据的处理方法
May 31 #PHP
thinkPHP框架中执行事务的方法示例
May 31 #PHP
You might like
PHP 实现判断用户是否手机访问
2015/01/21 PHP
PHP生成和获取XML格式数据的方法
2016/03/04 PHP
PHP 二维数组和三维数组的过滤
2016/03/16 PHP
Laravel如何友好的修改.env配置文件详解
2017/06/07 PHP
PHP递归遍历文件夹去除注释并压缩php源代码的方法示例
2018/05/23 PHP
精解window.setTimeout()&amp;window.setInterval()使用方式与参数传递问题!
2007/11/23 Javascript
js 数组实现一个类似ruby的迭代器
2009/10/27 Javascript
Egret引擎开发指南之编译项目
2014/09/03 Javascript
判断字符串的长度(优化版)中文占两个字符
2014/10/30 Javascript
javascript实现百度地图鼠标滑动事件显示、隐藏
2015/04/02 Javascript
JQuery判断checkbox是否选中及其它复选框操作方法合集
2015/06/01 Javascript
利用JS做网页特效_大图轮播(实例讲解)
2017/08/09 Javascript
JS闭包的几种常见形式实例详解
2017/09/16 Javascript
JS中常用的消息框总结
2018/02/24 Javascript
新版vue-cli模板下本地开发环境使用node服务器跨域的方法
2018/04/03 Javascript
微信小程序自定义导航教程(兼容各种手机)
2018/12/12 Javascript
浅谈webpack 四个核心概念之Entry
2019/06/12 Javascript
你或许不知道的一些npm实用技巧
2019/07/04 Javascript
JS原型和原型链原理与用法实例详解
2020/02/05 Javascript
vue+element UI实现树形表格
2020/12/29 Vue.js
Python使用Srapy框架爬虫模拟登陆并抓取知乎内容
2016/07/02 Python
python常见的格式化输出小结
2016/12/15 Python
Python requests发送post请求的一些疑点
2018/05/20 Python
python自动化报告的输出用例详解
2018/05/30 Python
pandas删除指定行详解
2019/04/04 Python
python基础梳理(一)(推荐)
2019/04/06 Python
python 安装移动复制第三方库操作
2020/07/13 Python
HTML5新表单元素_动力节点Java学院整理
2017/07/12 HTML / CSS
鱼油专家:Omegavia
2016/10/10 全球购物
eDreams巴西:廉价机票,酒店优惠和度假套餐
2017/04/14 全球购物
工程造价管理专业大专生求职信
2013/10/06 职场文书
家长会学生家长演讲稿
2013/12/29 职场文书
出国考察邀请函
2014/01/21 职场文书
医院搬迁方案
2014/06/14 职场文书
军人离婚协议书样本
2014/10/21 职场文书
Linux中一对多配置日志服务器的详细步骤
2022/07/23 Servers