Home  >  Article  >  Backend Development  >  PHP method to implement validity verification of Chinese citizen ID number

PHP method to implement validity verification of Chinese citizen ID number

墨辰丷
墨辰丷Original
2018-05-23 10:56:392037browse

This article mainly introduces PHP to implement the sample code for validating the Chinese citizen ID number, which can determine the correctness of the ID number and is of great practical value.

This article will use Java to implement the Chinese citizen (15 or 18 digits) ID number, the functions are as follows:

  1. ID card number validity verification

  2. Analyze detailed ID card information

  3. Generate a virtual province certificate number.

ID card number verification

1. Number structure The citizen identity number is a characteristic combination code, consisting of a seventeen-digit body code and a check code. The order from left to right is: six-digit address code, eight-digit date of birth code, three-digit sequence code and one-digit check code.

2. Address code (first six digits)

represents the administrative division code of the county (city, banner, district) where the coding object’s permanent residence is located, in GB/ The provisions of T2260 are implemented.

3. Date of birth code (seventh to fourteenth digit)

indicates the year, month and day of birth of the coding object, and shall be implemented in accordance with the provisions of GB/T7408 , no separators are used between year, month, and day codes.

4. Sequence code (15th to 17th digit)

means that within the area identified by the same address code, the same year, the same month, the same People born on the same day are assigned sequential numbers, with odd numbers assigned to men and even numbers assigned to women.

5. Check code (18th digit)

(1) Weighted summation formula of seventeen-digit ontology code S = Sum(Ai * Wi ), i = 0, …, 16, first sum the weights of the first 17 digits

Ai: represents the digital value of the ID number at the i-th position

Wi: represents the weighting factor Wi at the i-th position: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2

(2) Calculate modulus Y = mod(S, 11)

(3) Get the corresponding check code Y through the module: 0 1 2 3 4 5 6 7 8 9 10 Check code: 1 0 X 9 8 7 6 5 4 3 2

IDValidator.php

<?php
namespace com\jdk5\blog\IDValidator;
 
class IDValidator {
 private static $GB2260;
 private static $instance;
 private static $cache = array();
 private static $util;
 function __construct() {
 if (!class_exists("com\jdk5\blog\IDValidator\GB2260")){
 include &#39;GB2260.php&#39;;
 }
 if (!class_exists("com\jdk5\blog\IDValidator\util")){
 include &#39;util.php&#39;;
 }
 self::$GB2260 = GB2260::getGB2260 ();
 self::$util = util::getInstance();
 }
 public static function getInstance() {
 if (is_null ( self::$instance )) {
 self::$instance = new IDValidator ();
 }
 return self::$instance;
 }
 function isValid($id) {
 $code = self::$util->checkArg ( $id );
 if ($code === false) {
 return false;
 }
 // 查询cache
 if (isset ( self::$cache [ $id ] ) && self::$cache [$id] [&#39;valid&#39;] !== false) {
 return self::$cache [$id] [&#39;valid&#39;];
 } else {
 if (! isset ( self::$cache [ $id ] )) {
 self::$cache [$id] = array ();
 }
 }
 
 $addr = substr ( $code [&#39;body&#39;], 0, 6 );
 $birth = $code [&#39;type&#39;] === 18 ? substr ( $code [&#39;body&#39;], 6, 8 ) :
 substr ( $code [&#39;body&#39;], 6, 6 );
 $order = substr ( $code [&#39;body&#39;], - 3 );
 
 if (! (self::$util->checkAddr ( $addr ) && self::$util->checkBirth ( $birth ) &&
 self::$util->checkOrder ( $order ))) {
 self::$cache [$id] [&#39;valid&#39;] = false;
 return false;
 }
 
 // 15位不含校验码,到此已结束
 if ($code [&#39;type&#39;] === 15) {
 self::$cache [$id] [&#39;valid&#39;] = true;
 return true;
 }
 
 /* 校验位部分 */
 
 // 位置加权
 $posWeight = array ();
 for($i = 18; $i > 1; $i --) {
 $wei = self::$util->weight ( $i );
 $posWeight [$i] = $wei;
 }
 
 // 累加body部分与位置加权的积
 $bodySum = 0;
 $bodyArr = str_split( $code [&#39;body&#39;] );
 for($j = 0; $j < count ( $bodyArr ); $j ++) {
 $bodySum += (intval ( $bodyArr [$j], 10 ) * $posWeight [18 - $j]);
 }
 
 // 得出校验码
 $checkBit = 12 - ($bodySum % 11);
 if ($checkBit == 10) {
 $checkBit = &#39;X&#39;;
 } else if ($checkBit > 10) {
 $checkBit = $checkBit % 11;
 }
 // 检查校验码
 if ($checkBit != $code [&#39;checkBit&#39;]) {
 self::$cache [$id] [&#39;valid&#39;] = false;
 return false;
 } else {
 self::$cache [$id] [&#39;valid&#39;] = true;
 return true;
 }
 }
 // 分析详细信息
 function getInfo ($id) {
 // 号码必须有效
 if ($this->isValid($id) === false) {
 return false;
 }
 // TODO 复用此部分
 $code = self::$util->checkArg($id);
 
 // 查询cache
 // 到此时通过isValid已经有了cache记录
 if (isset(self::$cache[$id]) && isset(self::$cache[$id][&#39;info&#39;])) {
 return self::$cache[$id][&#39;info&#39;];
 }
 
 $addr = substr($code[&#39;body&#39;], 0, 6);
 $birth = ($code[&#39;type&#39;] === 18 ? substr($code[&#39;body&#39;], 6, 8) :
 substr($code[&#39;body&#39;], 6, 6));
 $order = substr($code[&#39;body&#39;], -3);
 
 $info = array();
 $info[&#39;addrCode&#39;] = $addr;
 if (self::$GB2260 !== null) {
 $info[&#39;addr&#39;] = self::$util->getAddrInfo($addr);
 }
 $info [&#39;birth&#39;] = ($code [&#39;type&#39;] === 18 ? (substr ( $birth, 0, 4 ) . &#39;-&#39; . substr ( $birth, 4, 2 ) . &#39;-&#39; . substr ( $birth, - 2 )) : (&#39;19&#39; . substr ( $birth, 0, 2 ) . &#39;-&#39; . substr ( $birth, 2, 2 ) . &#39;-&#39; . substr ( $birth, - 2 )));
 $info[&#39;sex&#39;] = ($order % 2 === 0 ? 0 : 1);
 $info[&#39;length&#39;] = $code[&#39;type&#39;];
 if ($code[&#39;type&#39;] === 18) {
 $info[&#39;checkBit&#39;] = $code[&#39;checkBit&#39;];
 }
 
 // 记录cache
 self::$cache[$id][&#39;info&#39;] = $info;
 
 return $info;
 }
 
 // 仿造一个号
 function makeID ($isFifteen=false) {
 // 地址码
 $addr = null;
 if (self::$GB2260 !== null) {
 $loopCnt = 0;
 while ($addr === null) {
 // 防止死循环
 if ($loopCnt > 50) {
  $addr = 110101;
  break;
 }
 $prov = self::$util->str_pad(self::$util->rand(66), 2, &#39;0&#39;);
 $city = self::$util->str_pad(self::$util->rand(20), 2, &#39;0&#39;);
 $area = self::$util->str_pad(self::$util->rand(20), 2, &#39;0&#39;);
 $addrTest = $prov . $city . $area;
 if (isset(self::$GB2260[$addrTest])) {
  $addr = $addrTest;
  break;
 }
 $loopCnt ++;
 }
 } else {
 $addr = 110101;
 }
 
 // 出生年
 $yr = self::$util->str_pad(self::$util->rand(99, 50), 2, &#39;0&#39;);
 $mo = self::$util->str_pad(self::$util->rand(12, 1), 2, &#39;0&#39;);
 $da = self::$util->str_pad(self::$util->rand(28, 1), 2, &#39;0&#39;);
 if ($isFifteen) {
 return $addr . $yr . $mo . $da
 . self::$util->str_pad(self::$util->rand(999, 1), 3, &#39;1&#39;);
 }
 
 $yr = &#39;19&#39; . $yr;
 $body = $addr . $yr . $mo . $da . self::$util->str_pad(self::$util->rand(999, 1), 3, &#39;1&#39;);
 
 // 位置加权
 $posWeight = array();
 for ($i = 18; $i > 1; $i--) {
 $wei = self::$util->weight($i);
 $posWeight[$i] = $wei;
 }
 
 // 累加body部分与位置加权的积
 $bodySum = 0;
 $bodyArr = str_split($body);
 for ($j = 0; $j < count($bodyArr); $j++) {
 $bodySum += (intval($bodyArr[$j], 10) * $posWeight[18 - $j]);
 }
 
 // 得出校验码
 $checkBit = 12 - ($bodySum % 11);
 if ($checkBit == 10) {
 $checkBit = &#39;X&#39;;
 } else if ($checkBit > 10) {
 $checkBit = $checkBit % 11;
 }
 return ($body . $checkBit);
 }
}

Call

<?php
header("Content-type: text/html; charset=utf-8");

include &#39;IDValidator.php&#39;;
$v = com\jdk5\blog\IDValidator\IDValidator::getInstance();

//生成一个18位身份证号
$id = $v->makeID();
//获取身份证信息
$info = $v->getInfo($id);
var_dump($info);
//生成一个15位身份证号
$id = $v->makeID(true);
$info = $v->getInfo($id);
var_dump($info);

//验证身份证号是否正确
var_dump($v->isValid("123456789012345678"));

The above is the entire content of this article, I hope it will be helpful to everyone's study.


Related recommendations:

php simple method to restore short URLs (short links) (available for testing)_php tips

PHP Chinese version of PSR specification_php basics

TestPHPConnect to MYSQL Code for success or failure_php basics

The above is the detailed content of PHP method to implement validity verification of Chinese citizen ID number. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn