函数一
/********************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;}
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 $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('身份证号码');
正文完