PHP验证身份证格式
互联网公司对身份证验证的需求越来越多,然而普通的小公司是无法对接公安部门的身份认证系统的。几乎都是在网上买一些大的互联网公司的一些认证服务。即使是便宜一些的认证价格也达到了10万次/万元。也就是一角钱一次了,还是挺贵哈。所以为了减少公司的开支,我们在拿到用户提交的身份证信息去认证前应该自己先检验一下身份证的格式,如果连最基本的身份证格式就不满足的话,我们完全可以直接驳回,不必走接下来的花钱认证流程了,而且也可以建立一个用户身份证表,把每次认证通过的数据存起来,以后每次都先从自己系统里的用户身份证表查询,查不到再去走认证流程,最大化节省公司开支。
这里提供一个初步验证身份证格式的PHP身份证验证类。该类只提供一个静态方法isValid接口,使用起来也很简单,只需要使用IdentityCard::isValid即可验证。可以放到自己项目中当做工具类。该方法可以同时验证15位的老身份证和18位的新身份证格式
PHP版本: >=7.0.0
注: 如果PHP版本低于7.0版本只需要把类中方法的参数限制取消掉即可使用。
class IdentityCard
{
/**
* 校验身份证号是否合法
* @param string $num 待校验的身份证号
* @return bool
*/
public static function isValid(string $num)
{
//老身份证长度15位,新身份证长度18位
$length = strlen($num);
if ($length == 15) { //如果是15位身份证
//15位身份证没有字母
if (!is_numeric($num)) {
return false;
}
// 省市县(6位)
$areaNum = substr($num, 0, 6);
// 出生年月(6位)
$dateNum = substr($num, 6, 6);
} else if ($length == 18) { //如果是18位身份证
//基本格式校验
if (!preg_match('/^\d{17}[0-9xX]$/', $num)) {
return false;
}
// 省市县(6位)
$areaNum = substr($num, 0, 6);
// 出生年月日(8位)
$dateNum = substr($num, 6, 8);
} else { //假身份证
return false;
}
//验证地区
if (!self::isAreaCodeValid($areaNum)) {
return false;
}
//验证日期
if (!self::isDateValid($dateNum)) {
return false;
}
//验证最后一位
if (!self::isVerifyCodeValid($num)) {
return false;
}
return true;
}
/**
* 省市自治区校验
* @param string $area 省、直辖市代码
* @return bool
*/
private static function isAreaCodeValid(string $area) {
$provinceCode = substr($area, 0, 2);
// 根据GB/T2260—999,省市代码11到65
if (11 <= $provinceCode && $provinceCode <= 65) {
return true;
} else {
return false;
}
}
/**
* 验证出生日期合法性
* @param string $date 日期
* @return bool
*/
private static function isDateValid(string $date) {
if (strlen($date) == 6) { //15位身份证号没有年份,这里拼上年份
$date = '19'.$date;
}
$year = intval(substr($date, 0, 4));
$month = intval(substr($date, 4, 2));
$day = intval(substr($date, 6, 2));
//日期基本格式校验
if (!checkdate($month, $day, $year)) {
return false;
}
//日期格式正确,但是逻辑存在问题(如:年份大于当前年)
$currYear = date('Y');
if ($year > $currYear) {
return false;
}
return true;
}
/**
* 验证18位身份证最后一位
* @param string $num 待校验的身份证号
* @return bool
*/
private static function isVerifyCodeValid(string $num)
{
if (strlen($num) == 18) {
$factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
$tokens = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
$checkSum = 0;
for ($i = 0; $i < 17; $i++) {
$checkSum += intval($num{$i}) * $factor[$i];
}
$mod = $checkSum % 11;
$token = $tokens[$mod];
$lastChar = strtoupper($num{17});
if ($lastChar != $token) {
return false;
}
}
return true;
}
}
使用示例:
// 测试
$num = '33071919610920021X';
if (IdentityCard::isValid($num)) {
echo '身份证格式正确';
} else {
echo '身份证格式不正确';
}
下面是身份证编码各个部分的含义:
//=============新的18位身份证号码各位的含义:=======================
//1-2位省、自治区、直辖市代码;11-65
//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。
PHP验证身份证格式的更多相关文章
- JAVA验证身份证格式及合法性
旅游电子商务中,预订酒店或订购门票时会以身份证作为消费凭证,为了防止客户误填身份证带来不必要麻烦,需要验证码格式及合法性,代码如下: /** * 判断身份证格式 * * @param idNum * ...
- js验证身份证格式
(function(){ Validate={ data:{ // 加权因子 Wi : [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 ...
- js使用正则表达式验证身份证格式
function checkIdentity(identity){ var reg = /^[1-9]{1}[0-9]{14}$|^[1-9]{1}[0-9]{16}([0-9]|[xX])$/; i ...
- js 精确验证身份证(地址编码、出生日期、校验位验证)
//身份证号合法性验证 //支持15位和18位身份证号 //支持地址编码.出生日期.校验位验证 function IdentityCodeValid(code) { ::::::::::::::::: ...
- JS验证身份证号码合法性
<html><head><script type="text/javascript"> function validateCard(){ ...
- jQuery validation学习(2)验证身份证
验证邮编 jQuery.validator.addMethod("isZipCode", function(value, element) { -]{}$/; return thi ...
- JS验证身份证的合法性
//验证身份证的合法性 function IdentityCodeValid(code) { var city={11:"北京",12:"天津",13:&quo ...
- bootstrap-validator基本使用(自定义验证身份证号和手机号)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...
- js验证身份证号码是否合规
需求:最近要做实名验证的功能,但是验证身份证号码和身份证图片的接口不想短信,比较贵,所以之前我们要验证严谨一点,参考了网上关于验证身份证号码的代码,总结一下 代码: //验证身份证号码 functio ...
随机推荐
- Python自学day-4
一.字符串转为字典(eval):也可以用于转列表.集合等 s1 = "['name','leo']" s_list = eval(s1) #字符串转换为列表 print(s_lis ...
- 如何正确选择挑选适合的VPS服务器
就来讲讲,如何挑选适合你的VPS.基本过程就是:1.你使用VPS的用途:2.你需要的线路:3.你要选择的操作系统:4.你购买VPS的大概预算是多少. 一.用途方法,其实买VPS就是:建站.VPN使用. ...
- HTML5新增的表单验证功能
一.HTML5表单的特点: HTML5 表单增加了许多内置的控件和控件属性 XHTML 中需要放在 form 之中的诸如 input/button/select/textarea 等标签元素,在 HT ...
- 002-pythn基础-循环、编码
1. 循环 while 条件: 代码块(循环体) else: 当上面的条件为假. 才会执行 执行顺序: 判断条件是否为真. 如果真. 执行循环体. 然后再次判断条件....直到循环条件为假. 程序退出 ...
- 事务的隔离级别,mysql默认的隔离级别是什么?
读未提交(Read uncommitted),一个事务可以读取另一个未提交事务的数据,最低级别,任何情况都无法保证. (1)所有事务都可以看到其他未提交事务的执行结果 (2)本隔离级别很少用于实际应用 ...
- C语言学习推荐《C语言参考手册(原书第5版)》下载
- python数据库-mongoDB的高级查询操作(55)
一.MongoDB索引 为什么使用索引? 假设有一本书,你想看第六章第六节讲的是什么,你会怎么做,一般人肯定去看目录,找到这一节对应的页数,然后翻到这一页.这就是目录索引,帮助读者快速找到想要的章节. ...
- Linux查看空间大小的命令
在linux中,常用查看空间大小的命令有df.du,下面依次介绍一下. df 命令是linux系统上以磁盘分区为单位来查看文件系统的命令,后面可以加上不同的参数来查看磁盘的剩余空间信息.Linux d ...
- secureCRT背景颜色
secureCRT是我们常用的linux远程登录软件,某些情况下我们安装的secureCRT工具可能默认背景颜色为白色,使用时很容易造成眼睛的疲劳,网上有些教程也只是修改当前登录窗口背景颜色,新的连接 ...
- 20131227-backgroundPosition
background-position 用法详细介绍 语法: background-position : length || length background-position : position ...