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中反射的应用
Jun 18 PHP
PHP实现对文本数据库的常用操作方法实例演示
Jul 04 PHP
安装ImageMagick出现error while loading shared libraries的解决方法
Sep 23 PHP
php自定义分页类完整实例
Dec 25 PHP
php实现图片以base64显示的方法
Oct 13 PHP
详解PHP用substr函数截取字符串中的某部分
Dec 03 PHP
PHP批量修改文件名称的方法分析
Feb 27 PHP
Smarty模板配置实例简析
Jul 20 PHP
解决laravel groupBy 对查询结果进行分组出现的问题
Oct 09 PHP
php设计模式之享元模式分析【星际争霸游戏案例】
Mar 23 PHP
深入分析PHP设计模式
Jun 15 PHP
基于PHP实现短信验证码发送次数限制
Jul 11 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
星际争霸, 教主第一视角, ZvT经典龙蛇演义
2020/03/02 星际争霸
Windows下的PHP5.0安装配制详解
2006/09/05 PHP
从网上搜到的phpwind 0day的代码
2006/12/07 PHP
php生成静态文件的多种方法分享
2012/07/17 PHP
php上传图片存入数据库示例分享
2014/03/11 PHP
PHP并发多进程处理利器Gearman使用介绍
2016/05/16 PHP
jQuery入门知识简介
2010/03/04 Javascript
asp.net下使用jquery 的ajax+WebService+json 实现无刷新取后台值的实现代码
2010/09/19 Javascript
javascript实现简单加载随机色方块
2015/12/25 Javascript
JavaScript焦点事件、鼠标事件和滚轮事件使用详解
2016/01/15 Javascript
详解获取jq ul第一个li定位的四种解决方案
2016/11/23 Javascript
JavaScript数组操作详解
2017/02/04 Javascript
浅谈Vue render函数在ElementUi中的应用
2018/09/06 Javascript
浅谈鸿蒙 JavaScript GUI 技术栈
2020/09/17 Javascript
[02:43]DOTA2英雄基础教程 德鲁伊
2014/01/13 DOTA
分享Python字符串关键点
2015/12/13 Python
Python列表推导式与生成器用法分析
2018/08/02 Python
python采集百度搜索结果带有特定URL的链接代码实例
2019/08/30 Python
使用Python 自动生成 Word 文档的教程
2020/02/13 Python
有趣的Python图片制作之如何用QQ好友头像拼接出里昂
2020/04/22 Python
python如何解析复杂sql,实现数据库和表的提取的实例剖析
2020/05/15 Python
浅谈Pycharm的项目文件名是红色的原因及解决方式
2020/06/01 Python
记录模型训练时loss值的变化情况
2020/06/16 Python
如何使用Python调整图像大小
2020/09/26 Python
Python将list元素转存为CSV文件的实现
2020/11/16 Python
如何在Canvas上的图形/图像绑定事件监听的实现
2020/09/16 HTML / CSS
加热夹克:RAVEAN
2018/10/19 全球购物
教师求职推荐信范文
2013/11/20 职场文书
思想政治教育专业个人求职信范文
2013/12/20 职场文书
应届生自荐信范文
2014/02/21 职场文书
入党积极分子学习优秀共产党员先进事迹思想汇报
2014/09/13 职场文书
领导班子四风对照检查材料思想汇报
2014/09/26 职场文书
2014镇党委书记党建工作汇报材料
2014/11/02 职场文书
订货会邀请函
2015/01/31 职场文书
2015年远程教育工作总结
2015/05/20 职场文书
一文彻底理解js原生语法prototype,__proto__和constructor
2021/10/24 Javascript