验证手机,邮箱,URL,身份证,密码公共函数

Writer @ ybzai 2020-03-22 16:47 阅读(1280)

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);
}
标签: PHP

感谢赞赏

微信支付
微信支付
支付宝
支付宝