| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- package com.ylx.common.utils;
- import org.apache.commons.lang3.StringUtils;
- import java.util.regex.Pattern;
- /**
- * 手机号工具类
- */
- public class PhoneUtils {
- /**
- * 国内手机号正则表达式 (支持11位手机号)
- */
- private static final Pattern PHONE_PATTERN = Pattern.compile("^(1[3-9]\\d{9})$");
- /**
- * 手机号脱敏处理
- * 规则:保留前3位,中间4位用*替换,保留后4位
- * 示例:13812345678 -> 138****5678
- *
- * @param phoneNumber 原始手机号
- * @return 脱敏后的手机号,若传入为空或格式不对则返回原值
- */
- public static String maskPhoneNumber(String phoneNumber) {
- // 1. 空值防御
- if (StringUtils.isBlank(phoneNumber)) {
- return null;
- }
- // 去除可能存在的空格
- phoneNumber = phoneNumber.trim();
- // 2. 格式校验:如果是标准的11位手机号,则进行脱敏
- if (PHONE_PATTERN.matcher(phoneNumber).matches()) {
- return phoneNumber.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
- }
- // 3. 如果不是标准手机号(如座机、海外号码、虚拟号等),可选择返回原值或全部打码
- return phoneNumber;
- }
- /**
- * 手机号高强度脱敏处理(隐藏中间6位)
- * 规则:保留前3位,中间6位用*替换,保留后2位
- * 示例:13812345678 -> 138******78
- *
- * @param phoneNumber 原始手机号
- * @return 脱敏后的手机号,若传入为空或格式不对则返回原值
- */
- public static String maskPhoneNumberStrict(String phoneNumber) {
- if (StringUtils.isBlank(phoneNumber)) {
- return null;
- }
- phoneNumber = phoneNumber.trim();
- // 仅对标准11位手机号执行6位脱敏
- if (PHONE_PATTERN.matcher(phoneNumber).matches()) {
- // 正则分组:(前3位)(中间6位)(后2位)
- return phoneNumber.replaceAll("(\\d{3})\\d{6}(\\d{2})", "$1******$2");
- }
- return phoneNumber;
- }
- /**
- * 获取手机号后4位
- * @param phoneNumber 原始手机号
- * @return 后4位;空/不足4位则返回null
- */
- public static String getPhoneTail4(String phoneNumber) {
- // 空值校验
- if (StringUtils.isBlank(phoneNumber)) {
- return null;
- }
- // 去除首尾空格
- String realPhone = phoneNumber.trim();
- // 长度不足4位直接返回null
- if (realPhone.length() < 4) {
- return null;
- }
- // 截取末尾4字符
- return realPhone.substring(realPhone.length() - 4);
- }
- /**
- * 校验手机号后四位是否匹配
- * 签到场景专用:完整手机号 vs 前端传入4位尾号
- * @param fullPhone 数据库完整11位手机号
- * @param inputTail4 用户输入的后4位
- * @return true=匹配,false=不匹配/手机号无效
- */
- public static boolean matchPhoneTail4(String fullPhone, String inputTail4) {
- // 输入尾号必须是4位数字
- if (StringUtils.isBlank(inputTail4) || inputTail4.length() != 4 || !StringUtils.isNumeric(inputTail4)) {
- return false;
- }
- String realTail = getPhoneTail4(fullPhone);
- // 手机号无效(空/不足4位)直接返回不匹配
- if (StringUtils.isBlank(realTail)) {
- return false;
- }
- // 相等校验
- return StringUtils.equals(realTail, inputTail4);
- }
- /**
- * 验证是否为合法的手机号格式
- */
- public static boolean isValidPhoneNumber(String phoneNumber) {
- if (StringUtils.isBlank(phoneNumber)) {
- return false;
- }
- return PHONE_PATTERN.matcher(phoneNumber.trim()).matches();
- }
- }
|