PHP根据身份证号码验证、获取星座、生肖和性别函数
首先介绍一下身份证含义
新的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;
}
}
?>
PHP根据身份证号码验证、获取星座、生肖和性别函数的更多相关文章
- 从身份证号码中获取性别、出生日期、籍贯,并更新mongodb
有这样的需求,人员信息是存在mongodb中,需要存放人员的身份证.性别.出生日期.籍贯等信息.通过脚本导入这些信息,但是只导入了身份证号码,其他信息空缺.现在需要补全其他信息. 其实身份证信息就包含 ...
- js正则实现二代身份证号码验证详解
js正则实现二代身份证号码验证详解 根据[中华人民共和国国家标准 GB 11643-1999]中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成.排列顺序从左至 ...
- C#实现身份证号码验证的方法
本文实例讲述了C#实现身份证号码验证的方法.分享给大家供大家参考.具体实现方法如下: 随着现在互联网的发展,越来越多的注册用户的地方都用到了身份证,那么对于输入的身份证如何验证呢?看下面的代码,其实很 ...
- 是否以某字符串结尾 是否以某字符串开始 是否是整数 裁减字符串空格 是否是浮点数 是否所有字符为数字类型 是否为空 是否是EMAIL 是否是电话号码 身份证号码验证-支持新的带x身份证 日期验证
/* 1.是否以某字符串结尾 endsWith(theStr,endStr) @param theStr:要判断的字符串 @param endStr:以此字符串结尾 @return boolean; ...
- Java 身份证号码验证
身份证号码验证 1.号码的结构 公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码 2.地址码(前 ...
- Javascript身份证号码验证
"来来来,坐这儿". "什么?我可是有身份的人,怎么能和你坐一块儿".沛笠晃了晃手里的身份证,不屑说道. "你咋不上天呢?有身份还喝油条吃豆浆&quo ...
- js身份证号码验证(小程序版)
参考知乎专栏文章https://zhuanlan.zhihu.com/p/22949023 <view class='bgw'> <form> ...... <view ...
- js实现身份证号码验证
/*根据[中华人民共和国国家标准 GB 11643-1999]中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数 ...
- js身份证号码验证
验证身份证号码的有效性,包含15位和18位: 根据[中华人民共和国国家标准 GB 11643-1999]中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成.排列 ...
随机推荐
- C# String 与 byte 互转
String转换为byte数组用byte[] arr = System.Text.Encoding.Default.GetBytes("abcde") byte数组转换为Strin ...
- jQuery插件开发入门
扩展jQuery插件和方法的作用是非常强大的,它可以节省大量开发时间.这篇文章将概述jQuery插件开发的基本知识,最佳做法和常见的陷阱. 入门 编写一个jQuery插件开始于给jQuery.fn加入 ...
- DataSnap
一. DataSnap REST - http://docwiki.embarcadero.com/RADStudio/Berlin/en/DataSnap_REST 1. URI Mapping: ...
- 海量数据面试题----分而治之/hash映射 + hash统计 + 堆/快速/归并排序
1.从set/map谈到hashtable/hash_map/hash_set 稍后本文第二部分中将多次提到hash_map/hash_set,下面稍稍介绍下这些容器,以作为基础准备.一般来说,STL ...
- C编译环境的搭建-sublime篇
1.安装sublime text 2.下载MingW: http://sourceforge.net/projects/mingw-w64/?source=typ_redirect 3.sublime ...
- Roads in the North(POJ 2631 DFS)
Description Building and maintaining roads among communities in the far North is an expensive busine ...
- Starship Troopers(HDU 1011 树形DP)
题意: 给定n个定点和m个士兵,n个定点最终构成一棵树,每个定点有一定x个bugs和y个value,每20个bug需要消耗一个士兵,不足20也消耗一个,然后最终收获y个value,只有父节点被占领后子 ...
- 十二、享元(Flyweight)模式--结构模式(Structural Pattern)
Flyweight在拳击比赛中指最轻量级,即"蝇量级",有些作者翻译为"羽量级".这里使用"享元 模式"更能反映模式的用意. 享元模式以共享 ...
- USB CCID "复杂"命令拾零?
本文记录 USB CCID 标准中几个"复杂"的命令,复杂在于在这些命令身上花的时间较之简单的命令多许多或者是理解的时间比较晚,可能就是刚才.主要有以下几条:ccid_T0APDU ...
- FileAccess枚举
FileAccess用于控制对文件的读访问.写访问或读/写访问的常熟.从源代码可以看到FileAccess是一个简单枚举. 枚举成员 成员值 描述 Read 1 对文件的读访问,拥有读取权限. Wri ...