if(!function_exists('is_email_valid')) {
/**
* [is_email_valid 验证邮箱合法]
* @param [type] $email [description]
* @return boolean [description]
*/
function is_email_valid($email='')
{
if(preg_match('/[_a-zA-Z\d\-\.]+(@[_a-zA-Z\d\-\.]+\.[_a-zA-Z\d\-]+)+$/i',$email) ) {
return true;
} else {
return false;
}
}
}
/**
* [is_phone_valid 验证手机号码是否合法]
* @param [type] $phone [description]
* @return boolean [description]
*/
function is_phone_valid($phone='')
{
return preg_match('/^13[\d]{9}$|14^[0-9]\d{8}$|^15[0-9]\d{8}$|^166\d{8}$|^170[015789]\d{7}$|^171[89]\d{7}$|^17[4678]\d{8}$|^18[0-9]\d{8}$|^198\d{8}$|^199\d{8}$/',$phone) === 1;
}
/**
* 检测Url是否为合法的http或https链接
* --------
* 1、仅检测http、https打头的网址字符串
* 2、网址中可带端口号
* 3、网址中可带get变量
* 4、网址中可带锚点
* --------
* @param mixed $url
* @return boolean
*/
function is_url_valid($url='')
{
return preg_match('/^http[s]?:\/\/(?:(?:[0-9]{1,3}\.){3}[0-9]{1,3}|(?:[0-9a-z_!~*\'()-]+\.)*(?:[0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\.[a-z]{2,6})(?::[0-9]{1,4})?(?:(?:\/\?)|(?:\/[0-9a-zA-Z_!~\*\'\(?:\)\.;\?:@&=\+\$,%#-\/]*)?)$/i',$url) === 1;
}
/**
* 检测传入的变量是否为一个合法的账户密码
* ---------
* 1、必须同时包含数字和字母,和特殊字符@_
* 2、通过第二个参数指定最小长度,默认值6
* 3、通过第三个可选参数指定最大长度,默认值18
* ---------
* @param string $password 需要被判断的字符串
* @param int $minLength 允许的账户密码最短位数 默认6
* @param int $maxLength 允许的账户密码最长位数 默认16
* @return boolean
*/
function is_password_valid($password='', $minLength = 6, $maxLength = 18)
{
if(strlen($password) > $maxLength || strlen($password) < $minLength)
{
return false;
}
return preg_match('/\d{1,'.$maxLength.'}/',$password) === 1 && preg_match('/[a-zA-Z]{1,'.$maxLength.'}/',$password) === 1 && preg_match('/[@_]{1,'.$maxLength.'}/',$password) === 1;
}
/**
* 检测传入的变量是否为一个合法的身份证号(15位、18位兼容)
* @param mixed $citizen_id
* @return false或者数组[]
*/
function is_card_id_valid($citizen_id='')
{
$id = strtoupper($citizen_id);
if(!(preg_match('/^\d{17}(\d|X)$/',$id) || preg_match('/^\d{15}$/',$id)))
{
return false;
}
# 15位老号码转换为18位
$Wi = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1);
$Ai = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
$cardNoSum = 0;
if(strlen($id)==16)
{
$id = substr(0, 6).'19'.substr(6, 9);
for($i = 0; $i < 17; $i++) {
$cardNoSum += substr($id,$i,1) * $Wi[$i];
}
$seq = $cardNoSum % 11;
$id = $id.$Ai[$seq];
}
# 效验18位身份证最后一位字符的合法性
$cardNoSum = 0;
$id17 = substr($id,0,17);
$lastString = substr($id,17,1);
for($i = 0; $i < 17; $i++)
{
$cardNoSum += substr($id,$i,1) * $Wi[$i];
}
$seq = $cardNoSum % 11;
$realString = $Ai[$seq];
# 最后一位效验失败 不是合法身份证号
if($lastString != $realString) {
return false;
}
# 地域仅能精确到省、自治区信息,再往下就需大量数据支撑才能精确
$oProvice = array(
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 => "国外"
);
$Provice = substr($id, 0, 2);
$BirthYear = substr($id, 6, 4);
$BirthMonth = substr($id, 10, 2);
$BirthDay = substr($id, 12, 2);
$Sex = substr($id, 16,1) % 2 ;//男1 女0
# 省份数据
if(!isset($oProvice[$Provice]))
{
return false;
}
# 年份超限
if($BirthYear > 2078 || $BirthYear < 1900)
{
return false;
}
# 年月日是否合法
$RealDate = strtotime($BirthYear.'-'.$BirthMonth.'-'.$BirthDay);
if(date('Y',$RealDate) != $BirthYear || date('m',$RealDate) != $BirthMonth || date('d',$RealDate) != $BirthDay)
{
return false;
}
#return true;
# 效验成功 返回关联数组,便于从身份证号中提取基本信息 boolean判断为true
return array('id'=>$id,'location'=>$oProvice[$Provice],'Y'=>$BirthYear,'m'=>$BirthMonth,'d'=>$BirthDay,'sex'=>$Sex);
}
验证手机,邮箱,URL,身份证,密码公共函数
Writer @ ybzai 2020-03-22 16:47 阅读(1280)