php 验证身份证(获取年龄、性别、出生日期)

// PHP 根据身份证号,自动获取对应的星座函数
function get_xingzuo($cid) { 
    // 根据身份证号,自动返回对应的星座
    if (!isIdCard($cid)) return '';
    $bir = substr($cid,10,4);
    $month = (int)substr($bir,0,2);
    $day = (int)substr($bir,2);
    $strValue = '';
    if(($month == 1 && $day <= 21) || ($month == 2 && $day <= 19)) { 
        $strValue = "水瓶座"; 
    }else if(($month == 2 && $day > 20) || ($month == 3 && $day <= 20)) { 
        $strValue = "双鱼座"; 
    }else if (($month == 3 && $day > 20) || ($month == 4 && $day <= 20)) { 
        $strValue = "白羊座"; 
    }else if (($month == 4 && $day > 20) || ($month == 5 && $day <= 21)) { 
        $strValue = "金牛座"; 
    }else if (($month == 5 && $day > 21) || ($month == 6 && $day <= 21)) { 
        $strValue = "双子座"; 
    }else if (($month == 6 && $day > 21) || ($month == 7 && $day <= 22)) { 
        $strValue = "巨蟹座"; 
    }else if (($month == 7 && $day > 22) || ($month == 8 && $day <= 23)) { 
        $strValue = "狮子座"; 
    }else if (($month == 8 && $day > 23) || ($month == 9 && $day <= 23)) { 
        $strValue = "处女座"; 
    }else if (($month == 9 && $day > 23) || ($month == 10 && $day <= 23)) { 
        $strValue = "天秤座";
    }else if (($month == 10 && $day > 23) || ($month == 11 && $day <= 22)) { 
        $strValue = "天蝎座"; 
    }else if (($month == 11 && $day > 22) || ($month == 12 && $day <= 21)) { 
        $strValue = "射手座"; 
    }else if (($month == 12 && $day > 21) || ($month == 1 && $day <= 20)) {
        $strValue = "魔羯座";
    }  
    return $strValue;
}
//根据身份证号,自动返回对应的生肖
function get_shengxiao($cid) {
    if(!isIdCard($cid)) return '';
    $start = 1901;
    $end = $end = (int)substr($cid,6,4);
    $x = ($start - $end) % 12;
    $value = "";
    if($x == 1 || $x == -11){
        $value = "鼠";
    }
    if($x == 0) {
        $value = "牛";
    } 
    if($x == 11 || $x == -1){
        $value = "虎";
    }
    if($x == 10 || $x == -2){
        $value = "兔";
    }
    if($x == 9 || $x == -3){
        $value = "龙";
    }
    if($x == 8 || $x == -4){
        $value = "蛇";
    }
    if($x == 7 || $x == -5){
        $value = "马";
    }
    if($x == 6 || $x == -6){
        $value = "羊";
    }
    if($x == 5 || $x == -7){
        $value = "猴";
    }
    if($x == 4 || $x == -8){
        $value = "鸡";
    }
    if($x == 3 || $x == -9){
        $value = "狗";
    }
    if($x == 2 || $x == -10){
        $value = "猪";
    }
    return $value;
}
//根据身份证号,自动返回性别
function get_xingbie($cid) {
    if(!isIdCard($cid)) return '';
    $sexint = (int)substr($cid,16,1);
    return $sexint % 2 === 0 ? '女' : '男';
}
//检查是否是身份证号
    public function isIdCard($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;
                }
            }
        }
    }
# 1.从身份证中获取出生日期
$stridbirthday = substr($idno, 6, 8);//idno是身份证号 截取日期并转为时间戳
$birthday = substr(stridbirthday,0,4).'-'. substr(stridbirthday,4,2).'-'. substr(stridbirthday,6,2);
//获取性别
public function getAgeFromIdNo($idno = '')
    {
        $btime = strtotime(substr($idno, 6, 8));//idno是身份证号 截取日期并转为时间戳
        $byear = date('Y', $btime);
        $bmonth = date('m', $btime);
        $bday = date('d', $btime);
        $curYear = date('Y');
        $curMoth = date('m');
        $curDay = date('d');
        $age = $curYear - $byear;
        if ($curMoth < $bmonth || ($curMoth == $bmonth && $curDay < $bday)) {
            $age--;
        }
        return $age;
    }
	public function get_age($idcard)
	{
		if(empty($idcard)) return null;
		#  获得出生年月日的时间戳
		$date = strtotime(substr($idcard,6,8));
		#  获得今日的时间戳
		$today = strtotime('today');
		#  得到两个日期相差的大体年数
		$diff = floor(($today-$date)/86400/365);
		#  strtotime加上这个年数后得到那日的时间戳后与今日的时间戳相比
		$age = strtotime(substr($idcard,6,8).' +'.$diff.'years')>$today?($diff+1):$diff;
		return $age;
	}

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值