PHP 常用有效性验证函数

摘要:手机号、身份证号、车牌号

身份证号验证

代码:

<?php
/**
* 验证身份证号
* @param string $id_card 身份证号码
* @return bool
*/
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
* @param int $idcard_base 身份证前17位
* @return bool|mixed
*/
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('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
$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位
* @param string $idcard 15位身份证号码
* @return bool|string
*/
function idcard_15to18($idcard)
{
if (strlen($idcard) != 15) {
return false;
} else {
// 如果身份证顺序码是996 997 998 999,这些是为百岁以上老人的特殊编码
if (array_search(substr($idcard, 12, 3), array('996', '997', '998', '999')) !== false) {
$idcard = substr($idcard, 0, 6) . '18' . substr($idcard, 6, 9);
} else {
$idcard = substr($idcard, 0, 6) . '19' . substr($idcard, 6, 9);
}
}
$idcard = $idcard . idcard_verify_number($idcard);
return $idcard;
}

/**
* 18位身份证校验码有效性检查
* @param string $idcard 18位身份证号码
* @return bool
*/
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;
}
}

使用方法:

validation_filter_id_card('身份证号码');

手机号

代码:

<?php

/**
* 验证手机号码合法
* @param int $mobile 手机号码
* @return bool
*/
function isMobile($mobile) {
if (!is_numeric($mobile)) {
return false;
}
return preg_match('#^13[\d]{9}$|^14[5,7]{1}\d{8}$|^15[^4]{1}\d{8}$|^17[0,5,6,7,8]{1}\d{8}$|^18[\d]{9}$#', $mobile) ? true : false;
}

使用方法:

isMobile('13666666666');

车牌号

代码:

<?php

/**
* 判断是否合法车牌号
* @param string $license 车牌号
* @return bool
*/
function isCarLicense($license)
{
if (empty($license)) {
return false;
}
#匹配民用车牌和使馆车牌
# 判断标准
# 1,第一位为汉字省份缩写
# 2,第二位为大写字母城市编码
# 3,后面是5位仅含字母和数字的组合
{
$regular = "/[京津冀晋蒙辽吉黑沪苏浙皖闽赣鲁豫鄂湘粤桂琼川贵云渝藏陕甘青宁新使]{1}[A-Z]{1}[0-9a-zA-Z]{5}$/u";
preg_match($regular, $license, $match);
if (isset($match[0])) {
return true;
}
}

#匹配特种车牌(挂,警,学,领,港,澳)
#参考 https://wenku.baidu.com/view/4573909a964bcf84b9d57bc5.html
{
$regular = '/[京津冀晋蒙辽吉黑沪苏浙皖闽赣鲁豫鄂湘粤桂琼川贵云渝藏陕甘青宁新]{1}[A-Z]{1}[0-9a-zA-Z]{4}[挂警学领港澳]{1}$/u';
preg_match($regular, $license, $match);
if (isset($match[0])) {
return true;
}
}

#匹配武警车牌
#参考 https://wenku.baidu.com/view/7fe0b333aaea998fcc220e48.html
{
$regular = '/^WJ[京津冀晋蒙辽吉黑沪苏浙皖闽赣鲁豫鄂湘粤桂琼川贵云渝藏陕甘青宁新]?[0-9a-zA-Z]{5}$/ui';
preg_match($regular, $license, $match);
if (isset($match[0])) {
return true;
}
}

#匹配军牌
#参考 http://auto.sina.com.cn/service/2013-05-03/18111149551.shtml
{
$regular = "/[A-Z]{2}[0-9]{5}$/";
preg_match($regular, $license, $match);
if (isset($match[0])) {
return true;
}
}
return false;
}

/**
* 判断是否合法车牌号另一个方法
* @param string $license 车牌号
* @return bool
*/
function isCarLicenseSimple($license) {
$regular = "/(([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z](([0-9]{5}[DF])|([DF]([A-HJ-NP-Z0-9])[0-9]{4})))|([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z][A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳使领]))$/u";
preg_match($regular, $license, $match);
if (isset($match[0])) {
return true;
}
}

使用方法:

isCarLicense('车牌号码');
isCarLicenseSimple('车牌号码');


转载至:黑白的自留地