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 和 XML: 使用expat函数(三)
Oct 09 PHP
用php实现的下载css文件中的图片的代码
Feb 08 PHP
PHP新手用的Insert和Update语句构造类
Mar 31 PHP
PHP制作百度词典查词采集器
Jan 29 PHP
微信公众平台实现获取用户OpenID的方法
Apr 15 PHP
分享10段PHP常用代码
Nov 11 PHP
PHP Cookei记录用户历史浏览信息的代码
Feb 03 PHP
WordPress中设置Post Type自定义文章类型的实例教程
May 10 PHP
PHP页面跳转操作实例分析(header方法)
Sep 28 PHP
PHP的Json中文处理解决方案
Sep 29 PHP
php常用字符串长度函数strlen()与mb_strlen()用法实例分析
Jun 25 PHP
goto语法在PHP中的使用教程
Sep 17 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 Coding Tips(php小技巧)[2011/04/02最后更新]
2011/05/02 PHP
PHP使用CURL_MULTI实现多线程采集的例子
2014/07/29 PHP
PHP实现Google plus的好友拖拽分组效果
2016/10/21 PHP
wordpress网站转移到本地运行测试的方法
2017/03/15 PHP
php记录搜索引擎爬行记录的实现代码
2018/03/02 PHP
ThinkPHP框架实现的微信支付接口开发完整示例
2019/04/10 PHP
详解将数据从Laravel传送到vue的四种方式
2019/10/16 PHP
document.documentElement &amp;&amp; document.documentElement.scrollTop
2007/12/01 Javascript
JavaScript中使用正则匹配多条,且获取每条中的分组数据
2010/11/30 Javascript
jquery的extend和fn.extend的使用说明
2011/01/09 Javascript
基于jquery的二级联动菜单实现代码
2011/04/25 Javascript
js获取图片大小的函数代码
2011/09/20 Javascript
js实现按钮加背景图片常用方法
2014/11/01 Javascript
jquery+json实现分页效果
2016/03/07 Javascript
基于vue的换肤功能的示例代码
2017/10/10 Javascript
利用jQuery+localStorage实现一个简易的计时器示例代码
2017/12/25 jQuery
vue移动端UI框架实现QQ侧边菜单组件
2018/03/09 Javascript
webpack4.x下babel的安装、配置及使用详解
2019/03/07 Javascript
javascript实现移动端上传图片功能
2020/08/18 Javascript
javascript实现简单留言板案例
2021/02/09 Javascript
[01:00:54]TI4正赛第二日开场
2014/07/20 DOTA
[00:36]DOTA2风云人物相约完美“圣”典 12月17日不见不散
2016/11/30 DOTA
从零学Python之入门(二)基本数据类型
2014/05/25 Python
用python结合jieba和wordcloud实现词云效果
2017/09/05 Python
Pymysql实现往表中插入数据过程解析
2020/06/02 Python
Windows 平台做 Python 开发的最佳组合(推荐)
2020/07/27 Python
Python return语句如何实现结果返回调用
2020/10/15 Python
Html5实现用户注册自动校验功能实例代码
2016/05/24 HTML / CSS
音乐学个人的自荐书范文
2013/11/26 职场文书
酒店总经理岗位职责
2014/03/17 职场文书
教师节感恩老师演讲稿
2014/08/28 职场文书
社会治安综合治理责任书
2015/01/29 职场文书
2016年校园重阳节广播稿
2015/12/18 职场文书
导游经典开场白——导游词
2019/04/17 职场文书
matplotlib画混淆矩阵与正确率曲线的实例代码
2021/06/01 Python
anaconda python3.8安装后降级
2021/06/11 Python