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 相关文章推荐
一个用mysql_odbc和php写的serach数据库程序
Oct 09 PHP
php上传、管理照片示例
Oct 09 PHP
POSIX 风格和兼容 Perl 风格两种正则表达式主要函数的类比(preg_match, preg_replace, ereg, ereg_replace)
Oct 12 PHP
php下将多个数组合并成一个数组的方法与实例代码
Feb 03 PHP
PHP处理excel cvs表格的方法实例介绍
May 13 PHP
采用thinkphp自带方法生成静态html文件详解
Jun 13 PHP
php递归json类实例
Dec 02 PHP
PHP表单提交后引号前自动加反斜杠的原因及三种办法关闭php魔术引号
Sep 30 PHP
CodeIgniter表单验证方法实例详解
Mar 03 PHP
PHP中常用的数组操作方法笔记整理
May 16 PHP
php基于单例模式封装mysql类完整实例
Oct 18 PHP
利用php生成验证码
Feb 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
探讨:parse url解析URL,返回其组成部分
2013/06/14 PHP
php的hash算法介绍
2014/02/13 PHP
PHP中session变量的销毁
2014/02/27 PHP
PHP实现通过正则表达式替换回调的内容标签
2015/06/15 PHP
CI框架入门之MVC简单示例
2016/11/21 PHP
php使用pecl方式安装扩展操作示例
2019/08/12 PHP
Alliance vs AM BO3 第二场2.13
2021/03/10 DOTA
JavaScript 字符串与数组转换函数[不用split与join]
2009/12/13 Javascript
JQuery扩展插件Validate—4设置错误提示的样式
2011/09/05 Javascript
将input file的选择的文件清空的两种解决方案
2013/10/21 Javascript
YUI模块开发原理详解
2013/11/18 Javascript
深入理解JavaScript系列(46):代码复用模式(推荐篇)详解
2015/03/04 Javascript
js简单实现点击左右运动的方法
2015/04/10 Javascript
实例讲解js验证表单项是否为空的方法
2016/01/09 Javascript
javascript每日必学之基础入门
2016/02/16 Javascript
AngularJS实现星星等级评分功能
2016/09/24 Javascript
vue的安装及element组件的安装方法
2018/03/09 Javascript
React如何解决fetch跨域请求时session失效问题
2018/11/02 Javascript
Nuxt.js的路由跳转操作(页面跳转nuxt-link)
2020/11/06 Javascript
python学习之面向对象【入门初级篇】
2017/01/21 Python
解决Pycharm界面的子窗口不见了的问题
2019/01/17 Python
python+tifffile之tiff文件读写方式
2020/01/13 Python
tensorflow入门:TFRecordDataset变长数据的batch读取详解
2020/01/20 Python
Python3连接Mysql8.0遇到的问题及处理步骤
2020/02/17 Python
python 实现两个线程交替执行
2020/05/02 Python
python怎么删除缓存文件
2020/07/19 Python
Pycharm学生免费专业版安装教程的方法步骤
2020/09/24 Python
html5嵌入内容_动力节点Java学院整理
2017/07/07 HTML / CSS
Html5页面在微信端的分享的实现方法
2018/08/30 HTML / CSS
美国高端牛仔品牌:Silver Jeans
2019/12/12 全球购物
Kipling澳洲官网:购买凯浦林包包
2020/12/17 全球购物
金士达面试非笔试
2012/03/14 面试题
大学生写自荐信的技巧
2014/01/08 职场文书
入党思想汇报怎么写
2014/04/03 职场文书
创建绿色社区汇报材料
2014/08/22 职场文书
2014年自愿离婚协议书范本
2014/09/25 职场文书