PHP根据身份证号码验证、获取星座、生肖和性别函数

泪湿孤枕 提交于 2019-12-20 07:09:21

首先介绍一下身份证含义

新的18位身份证号码各位的含义:
1-2位省、自治区、直辖市代码;
3-4位地级市、盟、自治州代码;
5-6位县、县级市、区代码;
7-14位出生年月日,比如19670401代表1967年4月1日;
15-17位为顺序号,其中17位男为单数,女为双数;
18位为校验码,0-9和X,由公式随机产生。
举例:
130503 19670401 0012这个身份证号的含义: 13为河北,05为邢台,03为桥西区,出生日期为1967年4月1日,顺序号为001,2为验证码。


15位身份证号码各位的含义:
1-2位省、自治区、直辖市代码;
3-4位地级市、盟、自治州代码;
5-6位县、县级市、区代码;
7-12位出生年月日,比如670401代表1967年4月1日,这是和18位号码的第一个区别;
13-15位为顺序号,其中15位男为单数,女为双数;
与18位身份证号的第二个区别:没有最后一位的验证码。

举例:
130503 670401 001的含义; 13为河北,05为邢台,03为桥西区,出生日期为1967年4月1日,顺序号为001。

居民身份证是国家法定的证明公民个人身份的证件。为了堵塞和制止假居民身份证的流通和使用,在查验和核查居民身份证时可掌握以下几个要点:

  一、居民身份证的整体识别

  1、居民身份证规格为88mm×60mm,四角呈圆弧状。式样为聚脂薄膜密封、持证人像片和登记内容一体化的单页卡式,即证件是经翻拍印制后塑封而成。

  2、证件正面主要颜色为红、绿二色,印有中华人民共和国国徽和证件名称,以及环状、网状、团状花纹图案;背面为浅绿色,印有中华人民共和国版图、持证人标准像片,以及网状花纹图案,姓名、性别、民族、出生年月日、住址五个登记项目和签发日期、有效期限、编号三个项目及签发机关印章。新的防伪居民身份证背面透视全息图象由长城峰火台图象IDCHINA中国等字样组成。“ID长城峰火台图象CHINA中国”在“中国CHINAID”组成的背景前由内向外依次排列。

  证件签发机关为县公安局、不设区的市公安局和设区的公安分局。

  3、居民身份证从登记项目、填写内容和颜色上还有其他两种形式:

  a.民族自治地方颁发的居民身份证。

  证件背面五个登记项目和签发机关印章,同时使用汉字和相应的少数民族文字印刷和刻制(宁夏回族自治区除外)。常见的少数民族文字有:维吾尔文、哈萨克文、蒙古文、藏文、朝鲜文、壮文、彝文等。

  证件“出生年月日”的登记项目改为“出生日期”。如:内地和经济特区颁发的证件,登记为“出生1949年10月1日”,民族自治地方颁发的证件则登记为“出生日期1949.10.1”。

  证件填写内容分为只书写汉字(如广西壮族自治区和内蒙古自治区部分地区)和同时书写汉字和少数民族文字(如新疆维吾尔自治区、西藏自治区、内蒙古自治区部分地区、吉林省延边朝鲜族自治州和四川、云南、青海、甘肃、黑龙江、吉林、辽宁等省部分民族自治地方)两类。少数民族文字在上方,汉字在下方(蒙古文文字在左,汉字在右)。

  对加入中国国籍的外国人,如本人的民族名称与我国民族名称不同,本人是什么民族就填写什么民族,但民族名称后应加注“入籍”二字,如“民族乌克兰(入籍)”。

  b.经济特区颁发的居民身份证识别:

  证件正面主体颜色为海蓝色,背面为浅蓝色。证件背面右上角有一个压模全息特殊标记,规格为9mm×12mm的全息标志图案。海南省经济特区的全息标志图案为五指山和太阳;深圳、珠海、汕头和厦门经济特区的全息标志图案为有带“T”字的盾牌符号。

  二、居民身份证有效期限与持证人年龄、签发日期的关系

  居民身份证的有效期限分为10年、20年、长期三种。16周岁至25周岁的,发给有效期为10年的居民身份证;26周岁至45周岁的,发给有效期为20年的居民身份证;46周岁以上的,发给长期有效的居民身份证。证件有效期限从签发之日起计算。如某人1949年9月20日出生,1984年35周岁时申领居民身份证,签发日期为1984年12月31日,他属于26至45周岁这一年龄段,证件有效期限属于20年这一档次,到2004年12月30日有效期满。

  查验或检查时,应对照检查证件有效期限与持证人年龄,签发日期三者之间的关系。

  三、居民身份证编号识别

  1、身份证编码规则如下:根据〖中华人民共和国国家标准GB11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。

  地址码(身份证前六位)表示编码对象第一次申领居民身份证时的常住户口所在县(市、旗、区)的行政区划代码。(所有区域的编码可以到这个网站http://www.stats.gov.cn/tjbz/index.htm查询到最新的县及县以上的行政编码资料。)

  生日期码(身份证第七位到第十四位)表示编码对象出生的年、月、日,其中年份用四位数字表示,年、月、日之间不用分隔符。例如:1981年05月11日就用19810511表示。

  顺序码(身份证第十五位到十七位)是县、区级政府所辖派出所的分配码,每个派出所分配码为10个连续号码,例如“000-009”或“060-069”,其中单数为男性分配码,双数为女性分配码,如遇同年同月同日有两人以上时顺延第二、第三、第四、第五个分配码。如:007的就是个男生,而且和他同年月日生的男生至少有两个,他们的后四位是001*和003*。分配顺序码中“999、998、997、996”四个顺序号分别为男女性百岁以上老人专用的特定编号。

  校验码(身份证最后一位)是根据前面十七位数字码,按照ISO7064:1983.MOD11-2校验码计算出来的检验码。

  2、从1999年10月1日起,全国实行公民身份证号码制度,居民身份证编号由原15位升至18位。前6位为地址码;第七位至14位为出生日期码,此码由6位数改为8位数,其中年份用4位数表示;第15位至17位为顺序码,取消了顺序码中对百岁老人使用的特定编号;第十八位为校验码,主要是为了校验计算机输入公民身份证号码的前17位数字是否正确,其取值范围是0至10,当值等于10时,用罗马数字符χ表示。

  四、临时身份证识别

  临时身份证规格、登记项目均与居民身份证相同。临时身份证正面为长城、群山和网状花纹图案,颜色为蓝色。背面为网状图案,颜色为黄色。临时身份证使用与本人身份证相同的编号;常住户口特定人员的临时身份证编号也按居民身份证编号原则和方法编15位码。

  临时身份证有效期限分为3个月和一年两种:尚待领取居民身份证或证件丢失、损坏尚待领补人员发给有效期3个月的临时身份证,使用阿拉伯数字填写;常住户口特定人员发给有效期一年的临时身份证,使用汉字填写。

  经济特区使用的临时身份证不加特区全息标记和荧光印刷图案。

  五、身份证第18位(校验码)的计算方法

  1、将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。

  2、将这17位数字和系数相乘的结果相加。

  3、用加出来和除以11,看余数是多少?

  4、余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字。其分别对应的最后一位身份证的号码为1-0-X-9-8-7-6-5-4-3-2。

  5、通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的Ⅹ。如果余数是10,身份证的最后一位号码就是2。

  例如:某男性的身份证号码是34052419800101001X。我们要看看这个身份证是不是合法的身份证。

  首先我们得出前17位的乘积和是189,然后用189除以11得出的结果是17+2/11,也就是说其余数是2。最后通过对应规则就可以知道余数2对应的数字是x。所以,可以判定这是一个合格的身份证号码。

  备注说明:关于大陆身份证有的人会发现前几位为什么变化了。这主要出现在中国的重庆。原有的重庆人的身份证多数以51开头。以前隶属于四川的原因。但新办的身份证可能是50开头,原因是行政区划改变所致。

 

相关函数如下:

<?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 ? '女' : '男';
}
function isIdCard($number) {
    //检查是否是身份证号
    // 转化为大写,如出现x
    $number = strtoupper($number);
    //加权因子
    $wi = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
    //校验码串
    $ai = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
    //按顺序循环处理前17位
    $sigma = 0;
    for($i = 0;$i < 17;$i++){
        //提取前17位的其中一位,并将变量类型转为实数
        $b = (int) $number{$i};      //提取相应的加权因子
        $w = $wi[$i];     //把从身份证号码中提取的一位数字和加权因子相乘,并累加
        $sigma += $b * $w;
    }
    //计算序号
    $snumber = $sigma % 11;
    //按照序号从校验码串中提取相应的字符。
    $check_number = $ai[$snumber];
    if($number{17} == $check_number){ 
        return true;
    }else{
        return false;
    }
}
?> 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!