亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時間:2018年11月07日 11:29:43   投稿:mrr  
這篇文章主要介紹了PHP校驗15位和18位身份證號,需要的朋友可以參考下

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

目前大家的身份證號大多是 18 位的,當然,也不排除有些老人的身份證號是 15 位的。

如果強制要求是 18 位的話,會比較好,因為 15 位的身份證號沒有校驗碼,可以說,只要了解大概結構,隨手都可以造出一系列身份證號碼來。

當然,如果只是單純的程序校驗, 18 位的身份證號碼也可以偽造,就是需要偽造者花點心思。

最好的還是調(diào)用相關部門給的接口,進行校驗。

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

身份證號規(guī)則

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

18位:省份(2位) + 地級市(2位) + 縣級市(2位) + 出生年(4位) + 出生月(2位) + 出生日(2位) + 順序號(3位) + 校驗位(1位)

相比之下, 18位 比 15位 多出生年 2位 、校驗位 1位 。

其中,順序號如果是偶數(shù),則說明是女生,順序號是奇數(shù),則說明是男生。

校驗位的計算:

有17位數(shù)字,分別是:

7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2

分別用身份證的前 17 位乘以上面相應位置的數(shù)字,然后相加。

接著用相加的和對 11 取模。

用獲得的值在下面 11 個字符里查找對應位置的字符,這個字符就是校驗位。

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

15位轉(zhuǎn)18位:

從上述的分析中,可以知道,只要補充上年分和校驗位就可以了。

一般情況下年份補充都是加上 19 就可以了。

校驗類的實現(xiàn)

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

  • 檢查身份是否正確(一般不會變化,而且省份不多)
  • 檢查地級市和縣級市(如果有這方面的資源,可以考慮,不過一般不建議)
  • 檢查年月日
  • 檢查校驗碼

當然,因為可能部分人用的是 15位 的身份證號,所以需要一個轉(zhuǎn)換的方法,不過,這里還是建議限制需要 18位 的身份證號。

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

初始化:

class IDCardFilter
{
  /**
   * 身份證號碼校驗
   *
   * @param string $idCard
   * @return bool
   */
  public function vaild($idCard)
  {
    // 基礎的校驗,校驗身份證格式是否正確
    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;
    }

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

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

檢測是否是身份證號碼:

這一塊的處理比較簡單,一個正則表達式搞定了。

其中, (^\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位轉(zhuǎn)18位:

邏輯不復雜,先判斷是否是15位,然后判斷需要添加的年份,最終生成校驗碼拼接返回就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);
}

校驗碼的生成:

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

/**
 * 生成校驗碼
 *
 * @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 => "臺灣", 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位 轉(zhuǎn) 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位身份證號的類封裝,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關文章

  • Yii實現(xiàn)顯示靜態(tài)頁的方法

    Yii實現(xiàn)顯示靜態(tài)頁的方法

    這篇文章主要介紹了Yii實現(xiàn)顯示靜態(tài)頁的方法,結合實例形式分析了Yii框架顯示靜態(tài)頁的步驟與相關實現(xiàn)技巧,需要的朋友可以參考下
    2016-04-04
  • Ajax中的JSON格式與php傳輸過程全面解析

    Ajax中的JSON格式與php傳輸過程全面解析

    這篇文章主要介紹了Ajax中的JSON格式與php傳輸過程及注意事項,文中給大家提到了JSON與php傳輸數(shù)據(jù)的代碼,需要的朋友參考下吧
    2017-11-11
  • php加密解密字符串示例

    php加密解密字符串示例

    加密解密在一個系統(tǒng)中的應用是非常常見的需求,PHP做的網(wǎng)站中,也會經(jīng)常使用的PHP加密解密字符串函數(shù).
    2016-10-10
  • thinkphp 3.2框架視圖模型 實例視圖查詢結果的二維數(shù)組合并操作示例

    thinkphp 3.2框架視圖模型 實例視圖查詢結果的二維數(shù)組合并操作示例

    這篇文章主要介紹了thinkphp 3.2框架視圖模型 實例視圖查詢結果的二維數(shù)組合并操作,結合實例形式分析了thinkPHP3.2針對視圖查詢結果的數(shù)組合并相關操作技巧,需要的朋友可以參考下
    2020-03-03
  • 微信公眾平臺開發(fā)之配置與請求

    微信公眾平臺開發(fā)之配置與請求

    微信公眾平臺是騰訊公司在微信的基礎上新增的功能模塊,通過這一平臺,個人和企業(yè)都可以打造一個微信的公眾號,并實現(xiàn)和特定群體的文字、圖片、語音的全方位溝通、互動。本文給大家介紹微信公眾平臺開發(fā)之配置與請求,需要的朋友可以參考下
    2015-08-08
  • 可以在線執(zhí)行PHP代碼包裝修正版

    可以在線執(zhí)行PHP代碼包裝修正版

    在寒竹、Fanbin等等熱心的朋友的幫助下,這款小巧的程序終于誕生了。 想做這款程序的初衷是方便測試一些代碼,這樣就不用新建文件->輸入代碼->保存->打開瀏覽器->定位到php文件->查看瀏覽結果這么一個繁瑣的過程了,現(xiàn)在只要把地址保存到收藏夾,然后要測試的時候,拿出來,直接輸入代碼測試就行了。 代碼輸入也挺方便的,自動高亮、自動完成,當然不支持代碼提示
    2008-03-03
  • php守護進程 加linux命令nohup實現(xiàn)任務每秒執(zhí)行一次

    php守護進程 加linux命令nohup實現(xiàn)任務每秒執(zhí)行一次

    那么有了這個命令以后我們php就寫成shell 腳本使用循環(huán)來讓我們腳本一直運行下去,不管我們終端窗口是否關閉都能夠讓我們php 腳本一直運行下去。
    2011-07-07
  • 2014年最新推薦的10款 PHP 開發(fā)框架

    2014年最新推薦的10款 PHP 開發(fā)框架

    在這篇文章我們會介紹 10 款最好的 PHP 框架,這些框架都是最新評定的,可以大大的簡化你的開發(fā)任務。這些 PHP 框架可以幫助開發(fā)者快速設計和開發(fā)各種跨瀏覽器的動態(tài)網(wǎng)站和 web 應用,最后,希望你能在這些列表中找到你想要的 PHP 框架!
    2014-08-08
  • PHP全概率運算函數(shù)(優(yōu)化版) Webgame開發(fā)必備

    PHP全概率運算函數(shù)(優(yōu)化版) Webgame開發(fā)必備

    PHP全概率運算函數(shù)(優(yōu)化版) Webgame開發(fā)必備,需要的朋友可以參考下。
    2011-07-07
  • Chart.js在Laravel項目中的應用示例

    Chart.js在Laravel項目中的應用示例

    本篇文章主要介紹了Chart.js在Laravel項目中的應用示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09

最新評論