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 相关文章推荐
屏蔽浏览器缓存另类方法
Oct 09 PHP
基于Zend的Config机制的应用分析
May 02 PHP
PHP+Mysql+Ajax+JS实现省市区三级联动
May 23 PHP
如何让thinkphp在模型中自动完成session赋值小教程
Sep 05 PHP
PHP与jquery实时显示网站在线人数实例详解
Dec 02 PHP
php指定长度分割字符串str_split函数用法示例
Jan 30 PHP
php动态读取数据清除最右边距的方法
Apr 12 PHP
PHP高精确度运算BC函数库实例详解
Aug 15 PHP
使用PHP连接数据库_实现用户数据的增删改查的整体操作示例
Sep 01 PHP
PHP迭代器和迭代的实现与使用方法分析
Apr 19 PHP
thinkPHP5框架闭包函数与子查询传参用法示例
Aug 02 PHP
Laravel5.5 数据库迁移:创建表与修改表示例
Oct 23 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令牌 Token改进版
2008/07/18 PHP
PHP生成网页快照 不用COM不用扩展.
2010/02/11 PHP
php使用json_encode对变量json编码
2014/04/07 PHP
PHP制作用户注册系统
2015/10/23 PHP
Yii2超好用的日期和时间组件(值得收藏)
2016/05/05 PHP
最新最全PHP生成制作验证码代码详解(推荐)
2016/06/12 PHP
thinkPHP5.0框架简单配置作用域的方法
2017/03/17 PHP
JS去除字符串的空格增强版(可以去除中间的空格)
2009/08/26 Javascript
javascript 函数及作用域总结介绍
2013/11/12 Javascript
jQuery 鼠标经过(hover)事件的延时处理示例
2014/04/14 Javascript
深入探究使JavaScript动画流畅的一些方法
2015/06/30 Javascript
在AngularJS中使用jQuery的zTree插件的方法
2016/04/21 Javascript
AngularJS Bootstrap详细介绍及实例代码
2016/07/28 Javascript
如何解决IONIC页面底部被遮住无法向上滚动问题
2016/09/06 Javascript
最全面的JS倒计时代码
2016/09/17 Javascript
JQuery和PHP结合实现动态进度条上传显示
2016/11/23 Javascript
vue通过watch对input做字数限定的方法
2017/07/13 Javascript
vue多页面开发和打包正确处理方法
2018/04/20 Javascript
Websocket 向指定用户发消息的方法
2020/01/09 Javascript
node.js基础知识汇总
2020/08/25 Javascript
详解Python编程中基本的数学计算使用
2016/02/04 Python
Python3中在Anaconda环境下安装basemap包
2018/10/21 Python
浅谈python中真正关闭socket的方法
2018/12/18 Python
python实现两个dict合并与计算操作示例
2019/07/01 Python
python类的实例化问题解决
2019/08/31 Python
pytorch 自定义卷积核进行卷积操作方式
2019/12/30 Python
Python基础进阶之海量表情包多线程爬虫功能的实现
2020/12/17 Python
Html5大文件断点续传实现方法
2015/12/05 HTML / CSS
PHP如何去执行一个SQL语句
2016/03/05 面试题
星空联盟C# .net笔试题
2014/12/05 面试题
项目副经理岗位职责
2013/12/30 职场文书
学校就业推荐信范文
2014/05/19 职场文书
会计个人实习计划书
2014/08/15 职场文书
2015年全国“爱牙日”宣传活动总结
2015/03/23 职场文书
大学感恩节活动总结
2015/05/05 职场文书
Docker与K8s关系介绍不会Docker也可以使用K8s
2022/06/25 Servers