php身份证号码合法性、有效性验证-php实用功能记录(三)

阅读552评论1

验证中国公民身份证号码的正确性、合法性、有效性,实用价值高。
有时候为了防止用户随意填写,一般验证一下数字和字符长度。。太随意了。。
当然,也有上传图片认证的,,下面这个功能类是验证身份号码的规范性,朋友们可以借鉴下


上代码:

class idcard{
/**
* 身份证号码判断
* @param string $idcard 身份证号
* @return bool
*/
public function check($idcard){
if(strlen($idcard)==18){
return self::idcard_checksum18($idcard);
}elseif((strlen($idcard)==15)){
$idcard=self::idcard_15to18($idcard);
return self::idcard_checksum18($idcard);
}else{
return false;
}
}
//计算身份证校验码,根据国家标准GB 11643-1999
private 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 = $checksum + substr($idcard_base,$i,1) * $factor[$i];
}
$mod=$checksum % 11;
$verify_number=$verify_number_list[$mod];
return $verify_number;
}
//将15位身份证升级到18位
private 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.self::idcard_verify_number($idcard);
return $idcard;
}
//18位身份证校验码有效性检查
private function idcard_checksum18($idcard){
if(strlen($idcard)!=18){
return false;
}
$idcard_base=substr($idcard,0,17);
if(self::idcard_verify_number($idcard_base)!=strtoupper(substr($idcard,17,1))){
return false;
}else{
return true;
}
}
}


老规矩,你可以整合到自己的系统上,这里只是提供下功能包
使用方法:

$card='123456789012345678';//身份证号码
$check=new idcard();
if($check->check($card)){
echo '合法有效';
}else{
echo '不合法无效';
}


1 位网友评论:

艾思 3年前(2021-04-30 16:11:09)

谢谢,借用了,博主

欢迎来评论

请填写验证码