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堆栈与列队的学习
Jun 21 PHP
使用PHP接收POST数据,解析json数据
Jun 28 PHP
PHP文件上传主要代码讲解
Sep 30 PHP
php操作memcache缓存方法分享
Jun 03 PHP
PHP实现搜索相似图片
Sep 22 PHP
PHP去掉json字符串中的反斜杠\及去掉双引号前的反斜杠
Sep 30 PHP
php打包压缩文件之ZipArchive方法用法分析
Apr 30 PHP
Yii框架扩展CGridView增加导出CSV功能的方法
May 24 PHP
PDO::_construct讲解
Jan 27 PHP
浅谈laravel5.5 belongsToMany自身的正确用法
Oct 17 PHP
PHP实现单例模式建立数据库连接的方法分析
Feb 11 PHP
基于PHP的微信公众号的开发流程详解
Aug 07 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
CI使用Tank Auth转移数据库导致密码用户错误的解决办法
2014/06/12 PHP
php以post形式发送xml的方法
2014/11/04 PHP
PHP获取数组最后一个值的2种方法
2015/01/21 PHP
php 调用百度sms来发送短信的实现示例
2018/11/02 PHP
PHP类与对象后期静态绑定操作实例详解
2018/12/20 PHP
js的event详解。
2006/09/06 Javascript
浅析JQuery中的html(),text(),val()区别
2014/09/01 Javascript
nodejs教程之环境安装及运行
2014/11/21 NodeJs
jQuery之DOM对象和jQuery对象的转换与区别分析
2015/01/08 Javascript
javascript实现日期时间动态显示示例代码
2015/09/08 Javascript
jQuery实现TAB选项卡切换特效简单演示
2016/03/04 Javascript
js调用webservice构造SOAP进行身份验证
2016/04/27 Javascript
jquery实现图片放大点击切换
2017/06/06 jQuery
Vue 使用中的小技巧
2018/04/26 Javascript
vue动画之点击按钮往上渐渐显示出来的实例
2018/09/29 Javascript
Vue中props的详解
2019/05/16 Javascript
javascript中call,apply,callee,caller用法实例分析
2019/07/24 Javascript
JavaScript Dom 绑定事件操作实例详解
2019/10/02 Javascript
python发送伪造的arp请求
2014/01/09 Python
Python实现获取汉字偏旁部首的方法示例【测试可用】
2018/12/18 Python
Python openpyxl读取单元格字体颜色过程解析
2019/09/03 Python
Python子进程subpocess原理及用法解析
2020/07/16 Python
详解torch.Tensor的4种乘法
2020/09/03 Python
css3的transform造成z-index无效解决方案
2014/12/04 HTML / CSS
使用纯 CSS 创作一个脉动 loader效果的源码
2018/09/28 HTML / CSS
SCHIESSER荷兰官方网站:德国内衣专家
2020/10/09 全球购物
存储过程的优点有哪些
2012/09/27 面试题
.NET笔试题(20个问题)
2016/02/02 面试题
写好求职应聘自荐信的三部曲
2013/09/21 职场文书
银行自荐信范文
2013/10/07 职场文书
供货协议书范本
2014/04/22 职场文书
求职信标题怎么写
2014/05/26 职场文书
公务员年度考核评语
2014/12/31 职场文书
党员个人承诺书
2015/04/27 职场文书
你会写报告?产品体验报告到底该怎么写?
2019/08/14 职场文书
GO语言字符串处理函数之处理Strings包
2022/04/14 Golang