欧美成人午夜免费全部完,亚洲午夜福利精品久久,а√最新版在线天堂,另类亚洲综合区图片小说区,亚洲欧美日韩精品色xxx

扣丁學(xué)堂PHP培訓(xùn)簡述PHP校驗(yàn)15位和18位身份證號(hào)的類封裝

2019-04-25 11:31:23 3936瀏覽

本篇文章扣丁學(xué)堂PHP培訓(xùn)小編給讀者們分享一下PHP校驗(yàn)15位和18位身份證號(hào)的類封裝,對(duì)PHP開發(fā)技術(shù)感興趣的小伙伴就隨小編來了解一下吧,希望對(duì)小伙伴們有幫助。



扣丁學(xué)堂PHP培訓(xùn)簡述PHP校驗(yàn)15位和18位身份證號(hào)的類封裝



目前大家的身份證號(hào)大多是18位的,當(dāng)然,也不排除有些老人的身份證號(hào)是15位的。如果強(qiáng)制要求是18位的話會(huì)比較好,因?yàn)?5位的身份證號(hào)沒有校驗(yàn)碼,可以說只要了解大概結(jié)構(gòu),隨手都可以造出一系列身份證號(hào)碼來。當(dāng)然,如果只是單純的程序校驗(yàn),18位的身份證號(hào)碼也可以偽造,就是需要偽造者花點(diǎn)心思,最好的還是調(diào)用相關(guān)部門給的接口,進(jìn)行校驗(yàn)。


本文所編寫的身份證號(hào)碼校驗(yàn),只是針對(duì)相關(guān)規(guī)則下的計(jì)算,是調(diào)用接口前能做的事情。


身份證號(hào)規(guī)則:


15位:省份(2位) + 地級(jí)市(2位) + 縣級(jí)市(2位) + 出生年(2位) + 出生月(2位) + 出生日(2位) + 順序號(hào)(3位)

18位:省份(2位) + 地級(jí)市(2位) + 縣級(jí)市(2位) + 出生年(4位) + 出生月(2位) + 出生日(2位) + 順序號(hào)(3位) + 校驗(yàn)位(1位)

相比之下,18位比15位多出生年2位、校驗(yàn)位1位。其中,順序號(hào)如果是偶數(shù),則說明是女生,順序號(hào)是奇數(shù),則說明是男生。


校驗(yàn)位的計(jì)算:


有17位數(shù)字,分別是:7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2

分別用身份證的前 17 位乘以上面相應(yīng)位置的數(shù)字,然后相加。接著用相加的和對(duì)11取模,用獲得的值在下面11個(gè)字符里查找對(duì)應(yīng)位置的字符,這個(gè)字符就是校驗(yàn)位。

'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'


15位轉(zhuǎn)18位:


從上述的分析中,可以知道,只要補(bǔ)充上年分和校驗(yàn)位就可以了,一般情況下年份補(bǔ)充都是加上19就可以了。


校驗(yàn)類的實(shí)現(xiàn):


通過分析身份證號(hào)的規(guī)則,了解到,有幾點(diǎn)是可以做的:

檢查身份是否正確(一般不會(huì)變化,而且省份不多)

檢查地級(jí)市和縣級(jí)市(如果有這方面的資源,可以考慮,不過一般不建議)

檢查年月日

檢查校驗(yàn)碼

當(dāng)然,因?yàn)榭赡懿糠秩擞玫氖?5位的身份證號(hào),所以需要一個(gè)轉(zhuǎn)換的方法,不過這里還是建議限制需要18位的身份證號(hào)。

    

下面開始實(shí)現(xiàn):


初始化:


class IDCardFilter
{
  /**
   * 身份證號(hào)碼校驗(yàn)
   *
   * @param string $idCard
   * @return bool
   */
  public function vaild($idCard)
  {
    // 基礎(chǔ)的校驗(yàn),校驗(yàn)身份證格式是否正確
    if (!$this->isCardNumber($idCard)) {
      return false;
    }

    // 將 15 位轉(zhuǎn)換成 18 位
    $idCard = $this->fifteen2Eighteen($idCard);

    // 檢查省是否存在
    if (!$this->checkProvince($idCard)) {
      return false;
    }

    // 檢查生日是否正確
    if (!$this->checkBirthday($idCard)) {
      return false;
    }

    // 檢查校驗(yàn)碼
    return $this->checkCode($idCard);
  }
}


上面已經(jīng)實(shí)現(xiàn)了一個(gè)校驗(yàn)的方法,里面調(diào)用了類里的很多方法,下面一一實(shí)現(xiàn)。


檢測是否是身份證號(hào)碼:


這一塊的處理比較簡單,一個(gè)正則表達(dá)式搞定了。


其中, (^\d{15}$) 用于匹配 15位 身份證號(hào)的情況; (^\d{17}(\d|X)$) 用于匹配 18位 身份證號(hào)的情況。const REGX = '#(^\d{15}$)|(^\d{17}(\d|X)$)#';


/**
 * 檢測是否是身份證號(hào)碼
 *
 * @param string $idCard
 * @return boolean
 */
public function isCardNumber($idCard)
{
  return preg_match(self::REGX, $idCard);
}


15位轉(zhuǎn)18位:


邏輯不復(fù)雜,先判斷是否是15位,然后判斷需要添加的年份,最終生成校驗(yàn)碼拼接返回就OK了。


/**
 * 15位轉(zhuǎn)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);
}


校驗(yàn)碼的生成:


詳細(xì)計(jì)算規(guī)則見上面,這里就不做重復(fù)的闡述了。


/**
 * 生成校驗(yàn)碼
 *
 * @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 => "內(nèi)蒙古",
  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 => "臺(tái)灣", 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);
}


校驗(yàn)碼比對(duì):


話說, 15位 轉(zhuǎn) 18位 的都完全不用考慮這個(gè)方法了。


/**
 * 校驗(yàn)碼比對(duì)
 *
 * @param string $idCard
 * @return void
 */
public function checkCode($idCard)
{
  $idCardBase = substr($idCard, 0, 17);
  $code = $this->genCode($idCardBase);
  return $idCard == ($idCardBase . $code);
}


想要了解更多關(guān)于PHP開發(fā)方面內(nèi)容的小伙伴,請(qǐng)關(guān)注扣丁學(xué)堂PHP培訓(xùn)官網(wǎng)、微信等平臺(tái),扣丁學(xué)堂IT職業(yè)在線學(xué)習(xí)教育有專業(yè)的PHP講師為您指導(dǎo),此外扣丁學(xué)堂老師精心推出的PHP視頻教程定能讓你快速掌握PHP從入門到精通開發(fā)實(shí)戰(zhàn)技能??鄱W(xué)堂PHP技術(shù)交流群:374332265。



扣丁學(xué)堂微信公眾號(hào)                          Python全棧開發(fā)爬蟲人工智能機(jī)器學(xué)習(xí)數(shù)據(jù)分析免費(fèi)公開課直播間


【關(guān)注微信公眾號(hào)獲取更多學(xué)習(xí)資料】         【掃碼進(jìn)入Python全棧開發(fā)免費(fèi)公開課】




查看更多關(guān)于“php培訓(xùn)資訊”的相關(guān)文章>>



標(biāo)簽: PHP培訓(xùn) PHP基礎(chǔ)教程 PHP學(xué)習(xí)視頻 PHP教學(xué)視頻 PHP入門教程 PHP教程視頻 PHP在線學(xué)習(xí) PHP在線視頻 PHP在線教程 扣丁學(xué)堂PHP培訓(xùn)

熱門專區(qū)

暫無熱門資訊

課程推薦

微信
微博
15311698296

全國免費(fèi)咨詢熱線

郵箱:codingke@1000phone.com

官方群:148715490

北京千鋒互聯(lián)科技有限公司版權(quán)所有   北京市海淀區(qū)寶盛北里西區(qū)28號(hào)中關(guān)村智誠科創(chuàng)大廈4層
京ICP備2021002079號(hào)-2   Copyright ? 2017 - 2022
返回頂部 返回頂部