您的位置:首页 > 编程语言 > PHP开发

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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: