Maison  >  Article  >  développement back-end  >  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

怪我咯
怪我咯original
2017-07-11 15:35:202575parcourir

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; 
      } 
    } 
  } 
 
}


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; 
 } 
}

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