public function test(){
$IDCard = $_GET['id'];
$result['error'] = 0;//0:未知错误,1:身份证格式错误,2:无错误
$result['isAdult'] = '';//0标示成年,1标示未成年
$result['birthday'] = '';//生日,格式如:2012-11-15
$city = array(
11 => "北京",
12 => "天津",
13 => "河北",
14 => "山西",
15 => "内蒙古",
21 => "辽宁",
22 => "吉林",
23 => "黑龙江",
31 => "上海",
32 => "江苏",
33 => "浙江",
34 => "安徽",
35 => "福建",
36 => "江西",
37 => "山东",
41 => "河南",
42 => "湖北",
43 => "湖南",
44 => "广东",
45 => "广西",
46 => "海南",
50 => "重庆",
51 => "四川",
52 => "贵州",
53 => "云南",
54 => "西藏 ",
61 => "陕西",
62 => "甘肃",
63 => "青海",
64 => "宁夏",
65 => "新疆",
71 => "台湾",
81 => "香港",
82 => "澳门",
91 => "国外",
);
// var_dump(!preg_match("/^[1-9]([0-9a-zA-Z]{17}|[0-9a-zA-Z]{14})$/i", $IDCard));die;
// var_dump((bool)preg_match("/^[1-9]\d{5}(19|20|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/", $IDCard) === false);die;
if((bool)preg_match("/^[1-9]\d{5}(19|20|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/", $IDCard) === false){
$result['error'] = 1;
}else if( isset($city[intval(substr($IDCard, 0, 2))]) === false ){
$result['error'] = 0;
}else{
if(strlen($IDCard) == 18){
//合法性验证
$factor = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 );
$parity = array(1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2 );
$sum = 0;
$ai = 0;
$wi = 0;
$code = array();
for ($i=0; $i < 17; $i++) {
$ai = $code[$i] = substr($IDCard, $i, 1);
$wi = $factor[$i];
$sum += $ai * $wi;
}
if($parity[$sum % 11] != strtoupper(substr($IDCard, 17, 1)) ){
$result['error'] = 0;
}else{
//年份
$tyear = intval(substr( $IDCard,6,4));
//月份
$tmonth = intval(substr( $IDCard,10,2));
//日
$tday = intval(substr( $IDCard,12,2));
//判断年月日是否未成年
if( $tyear > date("Y") || $tyear < (date("Y") - 100)){
$flag = 0;
}elseif($tmonth < 0 || $tmonth > 12){
$flag = 0;
}elseif($tday < 0 || $tday > 31){
$flag = 0;
}else{
$tdate = $tyear."-".$tmonth."-".$tday." 00:00:00";
if((time() - mktime(0, 0, 0, $tmonth, $tday, $tyear)) > 18 * 365 * 24 * 60 * 60){
$flag = 0;
$result['error'] = 2;
}else{
$flag = 1;
$result['error'] = 2;
}
}
}
}elseif( strlen($IDCard) == 15){
$tyear = intval("19".substr( $IDCard, 6, 2));
$tmonth = intval(substr( $IDCard, 8, 2));
$tday = intval(substr( $IDCard, 10, 2));
if( $tyear > date("Y") || $tyear < ( date("Y") - 100) ){
$flag = 0;
}elseif( $tmonth < 0 || $tmonth > 12){
$flag = 0;
}elseif( $tday < 0 || $tday > 31){
$flag = 0;
}else{
$tdate = $tyear."-".$tmonth."-".$tday." 00:00:00";
if((time() - mktime( 0, 0, 0, $tmonth, $tday, $tyear)) > 18 * 365 * 24 * 60 * 60){
$flag = 0;
$result['error'] = 2;
}else{
$flag = 1;
$result['error'] = 2;
}
}
}
}
if ($result['error'] == 2) {
$result['isAdult'] = $flag;//0标示成年,1标示未成年
$result['birthday'] = $tdate;//生日日期
}else if ($result['error'] == 1) {
$result['error'] = '身份证格式错误';//0:未知错误,1:身份证格式错误,2:无错误
unset( $result['isAdult']);
unset( $result['birthday']);
}else if ($result['error'] == 0) {
$result['error'] = '请填写正确的身份证';//0:未知错误,1:身份证格式错误,2:无错误
unset( $result['isAdult']);
unset( $result['birthday']);
}
var_dump($result);die;
// return $result;
}
PHP身份证格式,合法性,是否未成年验证
于 2020-01-09 11:51:47 首次发布