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 相关文章推荐
实用函数5
Nov 08 PHP
用PHP程序实现支持页面后退的两种方法
Jun 30 PHP
php 动态执行带有参数的类方法
Apr 10 PHP
php 取得瑞年与平年的天数的代码
Aug 10 PHP
记录mysql性能查询过程的使用方法
May 02 PHP
从PHP $_SERVER相关参数判断是否支持Rewrite模块
Sep 26 PHP
php实现执行某一操作时弹出确认、取消对话框
Dec 30 PHP
使用XHGui来测试PHP性能的教程
Jul 03 PHP
PHP实现的QQ空间g_tk加密算法
Jul 09 PHP
Symfony2学习笔记之插件格式分析
Mar 17 PHP
Laravel程序架构设计思路之使用动作类
Jun 07 PHP
php实现对短信验证码发送次数的限制实例讲解
Mar 04 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&amp;mysql(六)
2006/10/09 PHP
全世界最小的php网页木马一枚 附PHP木马的防范方法
2009/10/09 PHP
php引用传值实例详解学习
2013/11/06 PHP
PHP通过调用新浪API生成t.cn格式短网址链接的方法详解
2019/02/20 PHP
ThinkPHP5 框架引入 Go AOP,PHP AOP编程项目详解
2020/05/12 PHP
PHP number_format函数原理及实例解析
2020/07/14 PHP
PHP 实现重载
2021/03/09 PHP
js word表格动态添加代码
2010/06/07 Javascript
jQuery对象[0]是什么含义?
2010/07/31 Javascript
40款非常棒的jQuery 插件和制作教程(系列二)
2011/11/02 Javascript
原生js实现给指定元素的后面追加内容
2013/04/10 Javascript
小结Node.js中非阻塞IO和事件循环
2014/09/18 Javascript
javascript 判断两个日期之差的示例代码
2015/09/05 Javascript
基于jQuery和hwSlider实现内容左右滑动切换效果附源码下载(一)
2016/06/22 Javascript
vue双向数据绑定原理探究(附demo)
2017/01/17 Javascript
Web制作验证码功能实例代码
2017/06/19 Javascript
jQuery 循环遍历改变a标签的href(实例讲解)
2017/07/12 jQuery
Vuejs 2.0 子组件访问/调用父组件的方法(示例代码)
2018/02/08 Javascript
jQuery+vue.js实现的多选下拉列表功能示例
2019/01/15 jQuery
jQuery内容过滤选择器与子元素过滤选择器用法实例分析
2019/02/20 jQuery
关于vue里页面的缓存详解
2019/11/04 Javascript
vue父子模板传值问题解决方法案例分析
2020/02/26 Javascript
pycharm 使用心得(九)解决No Python interpreter selected的问题
2014/06/06 Python
Python处理JSON时的值报错及编码报错的两则解决实录
2016/06/26 Python
对Python中的@classmethod用法详解
2018/04/21 Python
对YOLOv3模型调用时候的python接口详解
2019/08/26 Python
Python利用 utf-8-sig 编码格式解决写入 csv 文件乱码问题
2020/02/21 Python
解决python虚拟环境切换无效的问题
2020/04/30 Python
20行代码教你用python给证件照换底色的方法示例
2021/02/05 Python
德国综合购物网站:OTTO
2018/11/13 全球购物
全球最大的生存食品、水和装备专用在线市场:BePrepared.com
2020/01/02 全球购物
演讲稿开场白
2014/01/13 职场文书
七年级思品教学反思
2016/02/20 职场文书
Python如何配置环境变量详解
2021/05/18 Python
「月刊Action」2022年5月号封面公开
2022/03/21 日漫
Python获取字典中某个key的value
2022/04/13 Python