php身份证校验
2015-07-23 09:44
489 查看
<?php
/*
* 校验规则是:
* (1)十七位数字本体码加权求和公式
* S = Sum(Ai * Wi), i = 0, ... , 16 ,先对前17位数字的权求和
* Ai:表示第i位置上的身份证号码数字值
* Wi:表示第i位置上的加权因子
* Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
* (2)计算模
* Y = mod(S, 11)
* (3)通过模得到对应的校验码
* Y: 0 1 2 3 4 5 6 7 8 9 10
* 校验码: 1 0 X 9 8 7 6 5 4 3 2
* 也就是说,如果得到余数为1则最后的校验位p应该为对应的0.如果校验位不是,则该身份证号码不正确。
**/
class cardCheack{
static private $powers = array('7','9','10','5','8','4','2','1','6','3','7','9','10','5','8','4','2'); #17
static private $parityBit = array('1','0','X','9','8','7','6','5','4','3','2');
static public function validId($cardno='')
{
$ret = array('isvalid'=>'', 'msg'=>'');
if(empty($cardno)){
return $ret;
}
switch(strlen($cardno)){
case 15:
$ret= self::validId15($cardno); break;
case 18:
$ret= self::validId18($cardno); break;
default:
return array(
'isvalid'=>false,
'msg'=>'',
);
}
return $ret;
}
#18bit身份证号校验
#@param: cardno 身份证号
#@return: true, false
static public function validId18($cardno='')
{
$_ret = array();
$_cardno = $cardno.'';
$_num = substr($cardno, 0, 17);
$_parityBit = (int)substr($cardno, 17);
$_powers = 0;
for($i = 0; $i < 17; $i++){
if($_num[$i] < '0' || $_num[$i] > '9'){
return array(
'isvalid'=>false,
'msg'=>'',
);
break;
}else{
#加权
$_powers += intval($_num[$i])*intval(self::$powers[$i]);
#性别
if($i==16 && intval($_num[$i])%2==0){
$_ret['msg'] = 'female';
}else{
$_ret['msg'] = 'male';
}
}
}
#校验
$mod = intval($_powers)%11;
$_ret['isvalid'] = (strtoupper(self::$parityBit[$mod])==$_parityBit) ? true: false;
return $_ret;
}
#15bit身份证号校验
#@param: cardno 身份证号
#@return: true, false
public function validId15($cardno=''){
$cardno = $cardno.'';
$len = strlen($cardno);
for($i=0; $i<$len; $i++){
if($cardno[$i] < '0' || $carno[$i] > '9'){
return array(
'isvalid'=>false,
'msg'=>'',
);
break;
}
}
$_year = substr($cardno, 6, 2);
$_month = substr($cardno, 8, 2);
$_day = substr($cardno, 10, 2);
$_sexbit= substr($cardno, 14);
#校验年份
if($_year < '01' || $_year > '90'){
return array(
'isvalid'=>false,
'msg'=>'',
);
}
if($_month < '01' || $_month > '12'){
return array(
'isvalid'=>false,
'msg'=>'',
);
}
if($_day < '01' || $_day> '31') {
return array(
'isvalid'=>false,
'msg'=>'',
);
}
#设置性别
return array(
'isvalid'=>true,
'msg'=>!!$_sexbit%2? 'male': 'felmale',
);
}
}
/*$obj = new cardCheack();
var_dump($obj->validId('412728198610110071'));
*/
var_dump(cardCheack::validId('412728198610110071'));
[/code]
来自为知笔记(Wiz)
相关文章推荐
- PHP 判断数组里的值是否有存在
- PHP中遇到的时区问题解决方法
- 【PHP代码】生成百度短链接
- PHP unlink删除本地中文名称的文件
- 页面链接 传递js变量给php控制器
- 10款PHP开源商城系统汇总介绍
- 浅析PHP中Session可能会引起并发问题
- 修改phpMyAdmin中的默认1440超时时间
- PHP中的一些安全配置
- 浅析PHP中Session可能会引起并发问题
- 10款PHP开源商城系统汇总介绍
- PHP中遇到的时区问题解决方法
- WampServer搭建php环境时遇到的问题汇总
- php实现图片等比例缩放代码
- PHP7.0版本备注
- PHP 常用的header头部定义
- php 备份数据库类
- PHP Excel导入多表
- PHP 多维数组进行排序
- Mac OSX系统下,使用homebrew搭建PHP开发环境