PHP検査15桁と18桁の身分証番号のパッケージ


新会社のフレームのソースコードは、この機能を発見したので、検索し、識別番号の検査クラスをカプセル化しました。
今は大体18人の身分証番号があります。もちろん、一部の老人の身分証番号は15人です。
18桁を強要すればいいです。15桁の身分証番号にはチェックコードがないので、大体の仕組みを知っていれば、ついでに一連の身分証番号を作ってもいいです。
もちろん、単なる手順検査なら、18人の身分証番号も偽造できます。
一番いいのはやはり関連部門からのインターフェースを呼び出して、検証します。
本明細書で作成された身分証明書番号検査は、関連規則の下での計算だけで、インターフェースを呼び出す前に行うことができるものです。
身分証番号規則
15位:省(2位)+地級市(2位)+県級市(2位)+生年(2位)+生月(2位)+生日(2位)+順番号(3位)
18位:省(2位)+地級市(2位)+県級市(2位)+生年(4位)+生月(2位)+生日(2位)+順番番(3位)+検査位(1位)
対照的に、18人は15人よりも出生年の2人、検査位の1人多いです。
なお、順番番号が偶数であれば、女の子、順番番号が奇数であることを示し、男性であることを示している。
検証ビットの計算:
17桁の数字があります。それぞれ:
7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2
身分証の上位17桁にそれぞれ上記の位置の数字を掛けて加算します。
次に加算の和で11を型取りします。
得られた値で下の11文字の中から該当する位置の文字を検索します。この文字はチェックビットです。
'1','0','X','9','8','7','6','5','4','3','2'
15位から18位へ:
上記の分析から、前年分と検査位を補充すればいいということが分かります。
一般的には、年度補足は全部19を加えたらいいです。
クラスの実装を検証
身分証番号の規則を分析することによって、いくつかのことができると分かりました。
  • は、アイデンティティが正しいかどうかを検査する(一般的には変化しないし、省も多くない)
  • .地級市と県級市を検査する(この方面の資源があれば考慮できるが、一般的には推奨しない)
  • 検査年月日
  • チェックサム
  • もちろん、一部の人が15桁の身分証番号を使っているので、変換の方法が必要ですが、ここでは18桁の身分証番号を制限することを提案します。
    以下から実行します。
    初期化:
    
    class IDCardFilter
    {
      /**
       *        
       *
       * @param string $idCard
       * @return bool
       */
      public function vaild($idCard)
      {
        //      ,           
        if (!$this->isCardNumber($idCard)) {
          return false;
        }
    
        //   15      18  
        $idCard = $this->fifteen2Eighteen($idCard);
    
        //        
        if (!$this->checkProvince($idCard)) {
          return false;
        }
    
        //         
        if (!$this->checkBirthday($idCard)) {
          return false;
        }
    
        //      
        return $this->checkCode($idCard);
      }
    }
    上にはもう一つの検査方法が実現されました。中にはクラスの多くの方法が呼び出されました。
    身分証番号かどうかを検出します。
    このブロックの処理は比較的簡単で,一つの正規表現ができた。
    その中で、(^\d{15}が15桁の身分証番号と一致する場合に使用されます。(^\d{17}(\d 124 X)$は、18ビットの識別番号と一致する場合に使用されます。const REGX = '#(^\d{15}$)|(^\d{17}(\d|X)$)#';
    
    /**
     *           
     *
     * @param string $idCard
     * @return boolean
     */
    public function isCardNumber($idCard)
    {
      return preg_match(self::REGX, $idCard);
    }
    15位から18位へ:
    ロジックは複雑ではないので、まず15桁かどうかを判断して、追加が必要な年を判断して、最終的にチェックマークを作成してスペルを返してもいいです。
    
    /**
     * 15  18 
     *
     * @param string $idCard
     * @return void
     */
    public function fifteen2Eighteen($idCard)
    {
      if (strlen($idCard) != 15) {
        return $idCard;
      }
    
      //          996 997 998 999,               
      // $code = array_search(substr($idCard, 12, 3), [996, 997, 998, 999]) !== false ? '18' : '19';
      //    19    
      $code = '19';
      $idCardBase = substr($idCard, 0, 6) . $code . substr($idCard, 6, 9);
      return $idCardBase . $this->genCode($idCardBase);
    }
    検証コードの生成:
    詳しい計算規則は上を見てください。ここでは繰り返しの説明はしません。
    
    /**
     *      
     *
     * @param string $idCardBase
     * @return void
     */
    final protected function genCode($idCardBase)
    {
      $idCardLength = strlen($idCardBase);
      if ($idCardLength != 17) {
        return false;
      }
      $factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
      $verifyNumbers = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
      $sum = 0;
      for ($i = 0; $i < $idCardLength; $i++) {
        $sum += substr($idCardBase, $i, 1) * $factor[$i];
      }
      $index = $sum % 11;
      return $verifyNumbers[$index];
    }
    省が正しいかどうかを確認します。
    
    protected $provinces = [
      11 => "  ", 12 => "  ", 13 => "  ",  14 => "  ", 15 => "   ",
      21 => "  ", 22 => "  ", 23 => "   ", 31 => "  ", 32 => "  ",
      33 => "  ", 34 => "  ", 35 => "  ",  36 => "  ", 37 => "  ", 41 => "  ",
      42 => "  ", 43 => "  ", 44 => "  ",  45 => "  ", 46 => "  ", 50 => "  ",
      51 => "  ", 52 => "  ", 53 => "  ",  54 => "  ", 61 => "  ", 62 => "  ",
      63 => "  ", 64 => "  ", 65 => "  ",  71 => "  ", 81 => "  ", 82 => "  ", 91 => "  "
    ];
    
    /**
     *         
     *
     * @param string $idCard
     * @return void
     */
    public function checkProvince($idCard)
    {
      $provinceNumber = substr($idCard, 0, 2);
      return isset($this->provinces[$provinceNumber]);
    }
    誕生日が正しいかどうかを検出します。
    ここも正則で年月日を合わせます。
    
    /**
     *         
     *
     * @param string $idCard
     * @return void
     */
    public function checkBirthday($idCard)
    {
      $regx = '#^\d{6}(\d{4})(\d{2})(\d{2})\d{3}[0-9X]$#';
      if (!preg_match($regx, $idCard, $matches)) {
        return false;
      }
      array_shift($matches);
      list($year, $month, $day) = $matches;
      return checkdate($month, $day, $year);
    }
    検証コード比:
    ところで、15位から18位まではこの方法は全く考えられなくなりました。
    
    /**
     *      
     *
     * @param string $idCard
     * @return void
     */
    public function checkCode($idCard)
    {
      $idCardBase = substr($idCard, 0, 17);
      $code = $this->genCode($idCardBase);
      return $idCard == ($idCardBase . $code);
    }
    完全コード
    転送ゲート:IDCard Filter
    最後に
    この機能はせいぜい斬新ですよね。なにしろこれまで接触したことがないですから。コードの断片に新しいメンバーが追加されて嬉しいです。
    以上は小编がご绍介したPHP検査15名と18名の身分証番号のパッケージです。皆様にご迷惑をおかけしたいのですが、もし何かご不明な点があれば、メッセージをください。小编はすぐにご返事します。ここでも私たちのサイトを応援してくれてありがとうございます。