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