|
- <?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'));
来自为知笔记(Wiz) |
|