php验证身份证号码正确性的函数


Posted in PHP onJuly 20, 2016

身份证验证最简单的就是判断长度了,当然这种非常简单破了如果要更规则一点我们需要对身份证号码进行一些按生成规则验证了,下面整理了一些函数我们来看看。

例子,今天分享一个php验证身份证号码是否正确函数.

/********************php验证身份证号码是否正确函数*********************/ 
function is_idcard( $id ) 
{ 
  $id = strtoupper($id); 
  $regx = "/(^\d{15}$)|(^\d{17}([0-9]|X)$)/"; 
  $arr_split = array(); 
  if(!preg_match($regx, $id)) 
  { 
    return FALSE; 
  } 
  if(15==strlen($id)) //检查15位 
  { 
    $regx = "/^(\d{6})+(\d{2})+(\d{2})+(\d{2})+(\d{3})$/"; 
 
    @preg_match($regx, $id, $arr_split); 
    //检查生日日期是否正确 
    $dtm_birth = "19".$arr_split[2] . '/' . $arr_split[3]. '/' .$arr_split[4]; 
    if(!strtotime($dtm_birth)) 
    { 
      return FALSE; 
    } else { 
      return TRUE; 
    } 
  } 
  else      //检查18位 
  { 
    $regx = "/^(\d{6})+(\d{4})+(\d{2})+(\d{2})+(\d{3})([0-9]|X)$/"; 
    @preg_match($regx, $id, $arr_split); 
    $dtm_birth = $arr_split[2] . '/' . $arr_split[3]. '/' .$arr_split[4]; 
    if(!strtotime($dtm_birth)) //检查生日日期是否正确 
    { 
      return FALSE; 
    } 
    else 
    { 
      //检验18位身份证的校验码是否正确。 
      //校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。 
      $arr_int = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2); 
      $arr_ch = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'); 
      $sign = 0; 
      for ( $i = 0; $i < 17; $i++ ) 
      { 
        $b = (int) $id{$i}; 
        $w = $arr_int[$i]; 
        $sign += $b * $w; 
      } 
      $n = $sign % 11; 
      $val_num = $arr_ch[$n]; 
      if ($val_num != substr($id,17, 1)) 
      { 
        return FALSE; 
      } //phpfensi.com 
      else 
      { 
        return TRUE; 
      } 
    } 
  } 
 
}

调用身份证验证函数
 $idc=is_idcard("身份证号码");
if($idc){echo "正确";}else{echo "错误";}

例子二:

function validation_filter_id_card($id_card){ 
 if(strlen($id_card)==18){ 
 return idcard_checksum18($id_card); 
 }elseif((strlen($id_card)==15)){ 
 $id_card=idcard_15to18($id_card); 
 return idcard_checksum18($id_card); 
 }else{ 
 return false; 
 } 
} 
// 计算身份证校验码,根据国家标准GB 11643-1999 
function idcard_verify_number($idcard_base){ 
 if(strlen($idcard_base)!=17){ 
 return false; 
 } 
 //加权因子 
 $factor=array(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2); 
 //校验码对应值 
 $verify_number_list=array('1','0','X','9','8','7','6','5','4','3','2'); 
 $checksum=0; 
 for($i=0;$i<strlen($idcard_base);$i++){ 
 $checksum += substr($idcard_base,$i,1) * $factor[$i]; 
 } 
 $mod=$checksum % 11; 
 $verify_number=$verify_number_list[$mod]; 
 return $verify_number; 
} 
// 将15位身份证升级到18位 
function idcard_15to18($idcard){ 
 if(strlen($idcard)!=15){ 
 return false; 
 }else{ 
 // 如果身份证顺序码是996 997 998 999,这些是为百岁以上老人的特殊编码 
 if(array_search(substr($idcard,12,3),array('996','997','998','999')) !== false){ 
  $idcard=substr($idcard,0,6).'18'.substr($idcard,6,9); 
 }else{ 
  $idcard=substr($idcard,0,6).'19'.substr($idcard,6,9); 
 } 
 } 
 $idcard=$idcard.idcard_verify_number($idcard); 
 return $idcard; 
} 
// 18位身份证校验码有效性检查 
function idcard_checksum18($idcard){ 
 if(strlen($idcard)!=18){ 
 return false; 
 } 
 $idcard_base=substr($idcard,0,17); 
 if(idcard_verify_number($idcard_base)!=strtoupper(substr($idcard,17,1))){ 
 return false; 
 }else{ 
 return true; 
 } 
}

调用方法如:validation_filter_id_card('身份证号码');

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
一步一步学习PHP(4) php 函数 补充2
Feb 15 PHP
php学习笔记 php中面向对象三大特性之一[封装性]的应用
Jun 13 PHP
利用PHP扩展vld查看PHP opcode操作步骤
Mar 04 PHP
基于PHP实现的事件机制实例分析
Jun 18 PHP
Symfony2获取web目录绝对路径、相对路径、网址的方法
Nov 14 PHP
php实现基于pdo的事务处理方法示例
Jul 21 PHP
thinkPHP5实现数据库添加内容的方法
Oct 25 PHP
PHP简单实现二维数组的矩阵转置操作示例
Nov 24 PHP
Laravel Eloquent ORM 实现查询表中指定的字段
Oct 17 PHP
PHP框架实现WebSocket在线聊天通讯系统
Nov 21 PHP
PHP接口类(interface)的定义、特点和应用示例
May 18 PHP
PHP时间相关常用函数用法示例
Jun 03 PHP
PHP加密解密类实例代码
Jul 20 #PHP
php图片添加水印例子
Jul 20 #PHP
支付宝服务窗API接口开发php版本
Jul 20 #PHP
PHP二维数组矩形转置实例
Jul 20 #PHP
php实现登录tplink WR882N获取IP和重启的方法
Jul 20 #PHP
PHP的AES加密算法完整实例
Jul 20 #PHP
postfixadmin忘记密码后的修改密码方法详解
Jul 20 #PHP
You might like
PHP输入流php://input介绍
2012/09/18 PHP
基于flush()不能按顺序输出时的解决办法
2013/06/29 PHP
PHP5.3与5.5废弃与过期函数整理汇总
2014/07/10 PHP
php防止恶意刷新与刷票的方法
2014/11/21 PHP
PHP中filter函数校验数据的方法详解
2015/07/31 PHP
PHP内核探索之变量
2015/12/22 PHP
ThinkPHP框架搭建及常见问题(XAMPP安装失败、Apache/MySQL启动失败)
2016/04/15 PHP
laravel中的错误与日志用法详解
2016/07/26 PHP
PHP实现表单提交时去除斜杠的方法
2016/12/26 PHP
PHP实现的杨辉三角求解算法分析
2019/03/11 PHP
php使用自带dom扩展进行元素匹配的原理解析
2020/05/29 PHP
JAVASCRIPT 对象的创建与使用
2021/03/09 Javascript
用javascript实现的图片马赛克后显示并切换加文字功能
2007/04/21 Javascript
js实现的真正的iframe高度自适应(兼容IE,FF,Opera)
2010/03/07 Javascript
jquery,js简单实现类似Angular.js双向绑定
2017/01/13 Javascript
js中setTimeout的妙用--防止循环超时
2017/03/06 Javascript
npm国内镜像 安装失败的几种解决方案
2017/06/04 Javascript
基于bootstrap写的一点localStorage本地储存
2017/11/21 Javascript
jquery radio 动态控制选中失效问题的解决方法
2018/02/28 jQuery
解决mpvue + vuex 开发微信小程序vuex辅助函数mapState、mapGetters不可用问题
2018/08/03 Javascript
JavaScript时间日期操作实例小结【5个示例】
2018/12/22 Javascript
了解Javascript中函数作为对象的魅力
2019/06/19 Javascript
Python中多个数组行合并及列合并的方法总结
2018/04/12 Python
Pyspider中给爬虫伪造随机请求头的实例
2018/05/07 Python
对python中数据集划分函数StratifiedShuffleSplit的使用详解
2018/12/11 Python
解决Jupyter notebook中.py与.ipynb文件的import问题
2020/04/21 Python
Scrapy-Redis之RedisSpider与RedisCrawlSpider详解
2020/11/18 Python
Matlab使用Plot函数实现数据动态显示方法总结
2021/02/25 Python
美国著名的户外用品品牌:L.L.Bean
2018/01/05 全球购物
英国网上自行车商店:Tredz Bikes
2019/10/29 全球购物
2014年国庆晚会主持词
2014/09/19 职场文书
村党支部书记四风问题个人对照检查材料思想汇报
2014/10/06 职场文书
劳务派遣管理制度(样本)
2019/08/23 职场文书
个人职业生涯规划之自我评估篇
2019/09/03 职场文书
CSS3常见动画的实现方式
2021/04/14 HTML / CSS
浅谈TypeScript 索引签名的理解
2021/10/16 Javascript