Maison > développement back-end > tutoriel php > PHP vérifie si le numéro d'identification est correct, exemple de code

PHP vérifie si le numéro d'identification est correct, exemple de code

怪我咯
Libérer: 2023-03-13 15:30:01
original
2638 Les gens l'ont consulté

La structure du numéro d'identification

Le numéro d'identification est un code combiné caractéristique, composé d'un code corporel à 17 chiffres et d'un code de contrôle à un bit.

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.

Code adresse (six premiers chiffres)

Indique le code ObjetLe code de la division administrative du comté (ville, bannière, district) où se trouve la résidence permanente est situé, dans les réglementations GB/T2260 sont mises en œuvre.

Code 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 est mis en œuvre conformément aux dispositions de GB/ T7408. L'année, le mois et aucun séparateur ne sont utilisés entre les codes japonais.

Code séquentiel (15ème au 17ème chiffre)

indique que les personnes nées la même année, le même mois et le même jour dans la zone identifiée par le même code d'adresse Les numéros de séquence, les nombres impairs sont attribués aux hommes, et les nombres pairs sont attribués aux femmes.

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

1. Formule de sommation pondérée du code d'ontologie à dix-sept chiffres

S = SUM( 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-ème position

Wi : Représente le facteur de pondération à la i-ème position

Wi : 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2

2. Module de calcul

Y = mod(S, 11 )

3. Obtenez le code de contrôle correspondant via le module

Y : 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

Exemple, aujourd'hui je vais partager une fonction PHP pour vérifier si le numéro d'identification est correct.

/********************php验证身份证号码是否正确函数*********************/ 
function is_idcard( $id ) 
{ 
  $id = strtoupper($id); 
  $regx = "/(^\d{15}$)|(^\d{17}([0-9]|X)$)/"; 
  $arr_split = array(); 
  if(!preg_match($regx, $id)) 
  { 
    return FALSE; 
  } 
  if(15==strlen($id)) //检查15位 
  { 
    $regx = "/^(\d{6})+(\d{2})+(\d{2})+(\d{2})+(\d{3})$/"; 
 
    @preg_match($regx, $id, $arr_split); 
    //检查生日日期是否正确 
    $dtm_birth = "19".$arr_split[2] . '/' . $arr_split[3]. '/' .$arr_split[4]; 
    if(!strtotime($dtm_birth)) 
    { 
      return FALSE; 
    } else { 
      return TRUE; 
    } 
  } 
  else      //检查18位 
  { 
    $regx = "/^(\d{6})+(\d{4})+(\d{2})+(\d{2})+(\d{3})([0-9]|X)$/"; 
    @preg_match($regx, $id, $arr_split); 
    $dtm_birth = $arr_split[2] . '/' . $arr_split[3]. '/' .$arr_split[4]; 
    if(!strtotime($dtm_birth)) //检查生日日期是否正确 
    { 
      return FALSE; 
    } 
    else 
    { 
      //检验18位身份证的校验码是否正确。 
      //校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。 
      $arr_int = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2); 
      $arr_ch = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'); 
      $sign = 0; 
      for ( $i = 0; $i < 17; $i++ ) 
      { 
        $b = (int) $id{$i}; 
        $w = $arr_int[$i]; 
        $sign += $b * $w; 
      } 
      $n = $sign % 11; 
      $val_num = $arr_ch[$n]; 
      if ($val_num != substr($id,17, 1)) 
      { 
        return FALSE; 
      } //phpfensi.com 
      else 
      { 
        return TRUE; 
      } 
    } 
  } 
 
}
Copier après la connexion


Fonction de vérification de l'identification de l'appel
$idc=is_idcard("Numéro de carte d'identité");
if($idc){echo "correct";}else{echo "error";}

Exemple 2 :


function validation_filter_id_card($id_card){ 
 if(strlen($id_card)==18){ 
 return idcard_checksum18($id_card); 
 }elseif((strlen($id_card)==15)){ 
 $id_card=idcard_15to18($id_card); 
 return idcard_checksum18($id_card); 
 }else{ 
 return false; 
 } 
} 
// 计算身份证校验码,根据国家标准GB 11643-1999 
function idcard_verify_number($idcard_base){ 
 if(strlen($idcard_base)!=17){ 
 return false; 
 } 
 //加权因子 
 $factor=array(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2); 
 //校验码对应值 
 $verify_number_list=array(&#39;1&#39;,&#39;0&#39;,&#39;X&#39;,&#39;9&#39;,&#39;8&#39;,&#39;7&#39;,&#39;6&#39;,&#39;5&#39;,&#39;4&#39;,&#39;3&#39;,&#39;2&#39;); 
 $checksum=0; 
 for($i=0;$i<strlen($idcard_base);$i++){ 
 $checksum += substr($idcard_base,$i,1) * $factor[$i]; 
 } 
 $mod=$checksum % 11; 
 $verify_number=$verify_number_list[$mod]; 
 return $verify_number; 
} 
// 将15位身份证升级到18位 
function idcard_15to18($idcard){ 
 if(strlen($idcard)!=15){ 
 return false; 
 }else{ 
 // 如果身份证顺序码是996 997 998 999,这些是为百岁以上老人的特殊编码 
 if(array_search(substr($idcard,12,3),array(&#39;996&#39;,&#39;997&#39;,&#39;998&#39;,&#39;999&#39;)) !== false){ 
  $idcard=substr($idcard,0,6).&#39;18&#39;.substr($idcard,6,9); 
 }else{ 
  $idcard=substr($idcard,0,6).&#39;19&#39;.substr($idcard,6,9); 
 } 
 } 
 $idcard=$idcard.idcard_verify_number($idcard); 
 return $idcard; 
} 
// 18位身份证校验码有效性检查 
function idcard_checksum18($idcard){ 
 if(strlen($idcard)!=18){ 
 return false; 
 } 
 $idcard_base=substr($idcard,0,17); 
 if(idcard_verify_number($idcard_base)!=strtoupper(substr($idcard,17,1))){ 
 return false; 
 }else{ 
 return true; 
 } 
}
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal