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(); } }