亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

PHP校驗15位和18位身份證號的類封裝

2024-05-05 00:05:47
字體:
來源:轉載
供稿:網友

新公司框架源碼的時候,發現了這個功能,于是搜索一番并封裝了一下身份證號校驗的類。

目前大家的身份證號大多是 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|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位,然后判斷需要添加的年份,最終生成校驗碼拼接返回就OK了。

/** * 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);}

完整代碼

傳送門:IDCardFilter

最后

這個功能最多算是新穎吧,畢竟之前沒有接觸過。很開心代碼片段里又增加了新的成員。

以上所述是小編給大家介紹的PHP校驗15位和18位身份證號的類封裝,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲人a成www在线影院| 8x海外华人永久免费日韩内陆视频| 亚洲精品久久久久久下一站| 91国产美女视频| 久久精品久久久久电影| 91在线视频成人| 亚洲精品日韩激情在线电影| 日韩中文字在线| 精品国产福利视频| 91久久精品国产91性色| 国产精品美女无圣光视频| 亚洲18私人小影院| 亚洲第一在线视频| 日韩电影免费观看在线观看| 国产精品美女www爽爽爽视频| 国模视频一区二区| 亚洲成人在线网| 国产精品人成电影在线观看| 久久国产精品视频| 亚洲男人av电影| 国产精品日日摸夜夜添夜夜av| 欧美做爰性生交视频| 国产成人avxxxxx在线看| 亚洲free性xxxx护士hd| 国产成人一区三区| 久久91亚洲精品中文字幕| 91美女片黄在线观看游戏| 国产精品午夜一区二区欲梦| 亚洲精品99久久久久| 狠狠爱在线视频一区| 国产97在线播放| 免费99精品国产自在在线| 欧美日韩国产区| 777777777亚洲妇女| 激情成人中文字幕| 日韩电影中文字幕在线观看| 欧美日韩国产一区二区| 久久久av网站| 国产精品久久久久久av下载红粉| 国产免费一区二区三区在线能观看| 亚洲激情国产精品| 精品国产一区二区三区四区在线观看| 欧美日韩国产色| 久久久久久久一区二区三区| 91精品久久久久久久久不口人| 久久精品中文字幕一区| 欧美性猛交xxxxx水多| 国产日韩中文字幕| 久久久久亚洲精品成人网小说| 亚洲第一区第一页| 国产精品亚洲欧美导航| 成人在线精品视频| 在线亚洲欧美视频| 国产精品久久久久av| 亚洲aaaaaa| 狠狠色噜噜狠狠狠狠97| 精品女同一区二区三区在线播放| 国产精品亚洲片夜色在线| 97精品国产97久久久久久春色| 成人午夜一级二级三级| 国产精品永久免费观看| 欧洲美女7788成人免费视频| 国产欧美韩国高清| 成人免费观看49www在线观看| 在线精品国产成人综合| 欧美福利在线观看| 国产一区二区三区高清在线观看| 主播福利视频一区| 亚洲精品国产成人| 日韩美女免费观看| 在线丨暗呦小u女国产精品| 亚洲影院在线看| 亚洲精品99久久久久| 美女黄色丝袜一区| 日韩av中文字幕在线| 啪一啪鲁一鲁2019在线视频| 欧美精品一二区| 一本色道久久综合狠狠躁篇的优点| 日韩av理论片| 国产视频精品自拍| 亚洲男人天堂九九视频| 亚洲综合自拍一区| 国产精品海角社区在线观看| 日韩精品视频免费专区在线播放| 欧美亚洲另类在线| 欧美成人免费全部| 亚洲久久久久久久久久久| 国产精品专区h在线观看| 国产精品成熟老女人| 欧美精品18videos性欧美| 亚洲一区二区三区成人在线视频精品| 亚洲一区二区三区四区视频| 国产精品女主播视频| 国产91精品久久久| 国产狼人综合免费视频| 97在线日本国产| 黄色一区二区三区| 中文字幕精品一区久久久久| 91精品啪在线观看麻豆免费| 操日韩av在线电影| 亚洲摸下面视频| 黄网动漫久久久| 久久久久久国产精品美女| 欧美日韩国产丝袜美女| 久久人人爽人人爽爽久久| 韩国三级电影久久久久久| 亚洲国产精品大全| 国内精品久久久久伊人av| 亚洲欧美激情一区| 成人激情视频免费在线| 日韩免费在线免费观看| 国产激情999| 欧美成人一区二区三区电影| 国产女同一区二区| 亚洲乱码国产乱码精品精| 亚洲国产婷婷香蕉久久久久久| 毛片精品免费在线观看| 在线成人激情黄色| 欧美电影免费观看电视剧大全| 一本一本久久a久久精品牛牛影视| 亚洲第一福利网| 亚洲人午夜精品| 黄色成人在线免费| 色婷婷久久一区二区| 成人在线免费观看视视频| 日韩电影大片中文字幕| 一区二区三区视频在线| 欧美午夜激情小视频| 成人免费在线视频网站| 精品国产欧美成人夜夜嗨| 精品国产依人香蕉在线精品| 2019中文字幕在线| 中文字幕亚洲国产| 一区二区在线视频| 欧美性一区二区三区| 亚洲人在线观看| 国产亚洲日本欧美韩国| 色婷婷综合成人av| 欧美成人精品在线视频| 国产999精品久久久| 96精品视频在线| 色综合影院在线| 亚洲综合色激情五月| 国产成人欧美在线观看| 欧美国产中文字幕| 精品一区二区三区四区在线| 亚洲欧美精品一区二区| 国产精品69久久久久| 日韩欧美在线观看视频| 亚洲黄色www网站| 久久久午夜视频| 欧洲永久精品大片ww免费漫画| 北条麻妃99精品青青久久| xxx一区二区| 亚洲欧洲第一视频| 一区二区欧美日韩视频| 国产91精品网站| 大桥未久av一区二区三区| 欧美日韩免费区域视频在线观看| 精品成人69xx.xyz| 欧美噜噜久久久xxx| 国产欧美精品一区二区三区-老狼| 欧美国产欧美亚洲国产日韩mv天天看完整| 91成人在线播放|