您的位置:时间博客>PHP>PHP常用正则表达式记录(长期更新)

PHP常用正则表达式记录(长期更新)

1、是否是合法的身份证:

/**
 * 身份证号验证(兼容15,18位)
 * @param  string  $idcard
 * @return empty|$idcard
 */
function isIdCardNo($idcard = '')
{
    $idcard = trim($idcard);
    if (empty($idcard)) {
        return '';
    }
    $City  = [
    	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 => "国外"
    ];
    $idCardLength = strlen($idcard);
    //长度验证
    if (!preg_match('/^\d{17}(\d|x)$/i', $idcard) and !preg_match('/^\d{15}$/i', $idcard)) {
        return '';
    }
    //地区验证
    if (!array_key_exists(intval(substr($idcard, 0, 2)), $City)) {
        return '';
    }
    // 15位身份证验证生日,转换为18位
    if ($idCardLength == 15) {
        $sBirthday = '19' . substr($idcard, 6, 2) . '-' . substr($idcard, 8, 2) . '-' .         substr($idcard, 10, 2);
        $d         = new DateTime($sBirthday);
        $dd        = $d->format('Y-m-d');
        if ($sBirthday != $dd) {
            return '';
        }
        $idcard = substr($idcard, 0, 6) . "19" . substr($idcard, 6, 9);//15to18
        $Bit18  = getVerifyBit($idcard);//算出第18位校验码
        $idcard = $idcard . $Bit18;
    }
    // 判断是否大于2078年,小于1900年
    $year = substr($idcard, 6, 4);
    if ($year < 1900 || $year > 2078) {
        return '';
    }
    //18位身份证处理
    $sBirthday = substr($idcard, 6, 4) . '-' . substr($idcard, 10, 2) . '-' . substr($idcard, 12, 2);
    $d         = new DateTime($sBirthday);
    $dd        = $d->format('Y-m-d');
    if ($sBirthday != $dd) {
        return '';
    }
    //身份证编码规范验证
    $idcard_base = substr($idcard, 0, 17);
    if (strtoupper(substr($idcard, 17, 1)) != getVerifyBit($idcard_base)) {
        return '';
    }

    return $idcard;
}
/*
 * 计算身份证校验码,根据国家标准GB 11643-1999
 */
function getVerifyBit($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;
}

2、是否是域名或ip:

/**
 * 校验域名或IP
 * @param  string $name
 * @return bool
 */
function checkDomain($name){
    $regIP = '/^([0-9]|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.([0-9]|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.([0-9]|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.([0-9]|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])$/' ;
    $regDomain = '/^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}$/' ;
    if(preg_match($regIP,$name) || preg_match($regDomain, $name)){
    	return true;
    } else{
        return false;
    }
}

3、是否是手机号码:

/**
 * 是否是手机号码
 */
$phone_regx = '/^1[35789]\d{9}$/';
if(preg_match($phone_regx, $kw)){
    echo "手机号码格式正确<br/>" ;
}else{
    echo "手机号码格式不正确<br/>" ;
}

4、是否是邮箱:

/**
* 是否是邮箱
* @return bool
*/
function verifyEmail($str){
    //@前面的字符可以是英文字母和._- ,._-不能放在开头和结尾,且不能连续出现
    $pattern = '/^[a-z0-9]+([._-][a-z0-9]+)*@([0-9a-z]+\.[a-z]{2,14}(\.[a-z]{2})?)$/i';
    if(preg_match($pattern,$str)){
        return true;
    }else{
        return false;
    }
}

5、是否是全中文:

//是否是全中文,需要是UTF-8编码
$chinese_regx = '/^[\x{4e00}-\x{9fa5}]+$/u';
if(preg_match($chinese_regx, $str)){
    echo "中文字符匹配正确<br/>" ;
}else{
    echo "中文字符匹配不正确<br/>" ;
}

6、是否含有中文:

$has_zh = '/[\x7f-\xff]/';
if(preg_match($has_zh, $str)){
    echo "含有中文<br/>" ;
}else{
    echo "不含有中文<br/>" ;
}

7、是否有重复字符:

//UTF-8 字符串中是否有重复字符
$repeat_regx = '/^(\w)\1+(\d)\2+$/'; //UTF-8
if(preg_match($repeat_regx, $str)){
    echo "重复字符匹配正确<br/>" ;
}else{
    echo "重复字符匹配不正确<br/>" ;
}

8、过滤HTML注释:

$str = preg_replace('#<!--[^\!\[]*?(?<!\/\/)-->#','',$str);

9、URL中是否带http/https:

if (!preg_match('/^http(s)?:\\/\\/.+/',$url)) {
    echo '不带http/https';
} else {
    echo '带http/https';
}


转载请注明本文标题和链接:《 PHP常用正则表达式记录(长期更新)
分享到:

相关推荐

网友评论 0

未登陆 表情
Ctrl+Enter快速提交