Maison  >  Article  >  développement back-end  >  Méthode PHP pour mettre en œuvre la vérification de la validité du numéro d'identification du citoyen chinois

Méthode PHP pour mettre en œuvre la vérification de la validité du numéro d'identification du citoyen chinois

墨辰丷
墨辰丷original
2018-05-23 10:56:392035parcourir

Cet article présente principalement PHP pour implémenter l'exemple de code de validation du numéro d'identification de citoyen chinois, qui peut déterminer l'exactitude du numéro d'identification et est d'une grande valeur pratique

Cet article utilisera Java pour implémenter le Citoyen chinois (15 ou 18 chiffres), les fonctions sont les suivantes :

  1. Vérification de la validité du numéro de carte d'identité

  2. Analyser les informations détaillées de la carte d'identité

  3. Analyser les informations détaillées de la carte d'identité

Générez un numéro de certificat provincial virtuel.


Vérification du numéro de carte d'identité


Structure du numéro Le numéro d'identité du citoyen est un code combiné caractéristique, composé de dix-sept-. code corporel à chiffres et un code de contrôle. L'ordre de gauche à droite est le suivant : code d'adresse à six chiffres, code de date de naissance à huit chiffres, code de séquence à trois chiffres et code de contrôle à un chiffre.


2. Code d'adresse (six premiers chiffres)


indique le code de division administrative du comté (ville, bannière, district) où se trouve la résidence permanente de l'objet de codage , en GB/ Les dispositions du T2260 sont mises en œuvre.


3. Code de date de naissance (septième à quatorzième chiffres)


indique l'année, le mois et le jour de naissance de l'objet de codage, et doit être mis en œuvre conformément avec les dispositions du GB/T7408, aucun séparateur n'est utilisé entre les codes de l'année, du mois et du jour.


4. Code de séquence (15ème au 17ème chiffre)


signifie que dans la zone identifiée par le même code d'adresse, la même année, le même mois, le même Les personnes nées le même jour se voient attribuer des numéros de série, les numéros impairs étant attribués aux hommes et les numéros pairs aux femmes.


5. Code de vérification (dix-huitième chiffre)


(1) Formule de sommation pondérée du code d'ontologie à dix-sept chiffres S = Somme (Ai * Wi ), i = 0, …, 16, additionnez d'abord les poids des 17 premiers chiffres


Ai : représente la valeur numérique du numéro d'identification à la i-ième position


Wi : représente le facteur de pondération Wi à la i-ème position : 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2


(2) Calculer le module Y = mod(S, 11)


(3) Obtenez le code de contrôle Y correspondant via le module : 0 1 2 3 4 5 6 7 8 9 10 Code de contrôle : 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);
 }
}

<?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"));
Appeler


Ce qui précède représente l'intégralité du contenu de cet article, j'espère qu'il sera utile à l'étude de chacun.

Recommandations associées :

Méthode simple php pour restaurer des URL courtes (liens courts) (disponibles pour les tests)_astuces php

PHP

Version chinoise des bases de la spécification PSR_php
Test

PHP

pour se connecter à MYSQL Code pour le succès ou l'échec_php bases

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn