Java开发实现国际手机号及归属地的判断 您所在的位置:网站首页 刀型闸阀适合频繁开关吗 Java开发实现国际手机号及归属地的判断

Java开发实现国际手机号及归属地的判断

2023-12-13 12:49| 来源: 网络整理| 查看: 265

现有的微信小程序项目中需要实现登录界面手机号归属地的匹配,具体规则如下图(不是很清晰,将就一下): 在这里插入图片描述 这个项目需要实现国际手机号和归属地的判断,没试过这种开发一开始我也懵了,查找各种资料收集了三种方法和大家一起学习进步! 第一种:判断国内手机号格式验证及属于哪个运营商

package com.galaxy.platform.cornucopia.utils; import com.google.i18n.phonenumbers.NumberParseException; import com.google.i18n.phonenumbers.PhoneNumberUtil; import com.google.i18n.phonenumbers.Phonenumber; import com.google.i18n.phonenumbers.geocoding.PhoneNumberOfflineGeocoder; import java.util.Locale; import java.util.regex.Pattern; /** * @author liuzy * @date 2020/5/25 */ public class PhoneUtils { /** * 中国电信号码格式验证 手机段: 133,153,180,181,189,177,1700,173,199,191 **/ private static final String CHINA_TELECOM_PATTERN = "(^1(33|53|77|73|99|8[019]|9[1])\\d{8}$)|(^1700\\d{7}$)"; /** * 中国联通号码格式验证 手机段:130,131,132,155,156,185,186,145,175,176,166,1709 **/ private static final String CHINA_UNICOM_PATTERN = "(^1(3[0-2]|4[5]|5[56]|6[6]|7[56]|8[56])\\d{8}$)|(^1709\\d{7}$)"; /** * 中国移动号码格式验证 * 手机段:134,135,136,137,138,139,150,151,152,157,158,159,182,183,184,187,188,147,178,198,1705 **/ private static final String CHINA_MOBILE_PATTERN = "(^1(3[4-9]|4[7]|5[0-27-9]|7[8]|8[2-478]|9[8])\\d{8}$)|(^1705\\d{7}$)"; /** * 查询电话属于哪个运营商 * * @param tel 手机号码 * @return 0:不属于任何一个运营商,1:移动,2:联通,3:电信 */ public static Integer getPhoneISP(String tel) { boolean b1 = tel == null || tel.trim().equals("") ? false : match(CHINA_MOBILE_PATTERN, tel); if (b1) { return 1; } b1 = tel == null || tel.trim().equals("") ? false : match(CHINA_UNICOM_PATTERN, tel); if (b1) { return 2; } b1 = tel == null || tel.trim().equals("") ? false : match(CHINA_TELECOM_PATTERN, tel); if (b1) { return 3; } return 0; } /** * 匹配函数 * @param regex * @param tel * @return */ private static boolean match(String regex, String tel) { return Pattern.matches(regex, tel); } public static String checkPhone(String tel) { PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance(); PhoneNumberOfflineGeocoder phoneNumberOfflineGeocoder = PhoneNumberOfflineGeocoder.getInstance(); String language ="CN"; Phonenumber.PhoneNumber referencePhonenumber = null; try { referencePhonenumber = phoneUtil.parse(tel, language); } catch (NumberParseException e) { e.printStackTrace(); } //手机号码归属城市 city return phoneNumberOfflineGeocoder.getDescriptionForNumber(referencePhonenumber, Locale.CHINA); } }

第二种:通过定义一个枚举类,然后通过for~each遍历进行判断(我这里用的是基于SpringCloud框架实现)

package com.galaxy.platform.eapro.utils; /** * @author liuzy * @date 2020/5/25 * @descripe 枚举类 * */ public enum MobileRegularExp { //国际手机 区号 CN("中国", "^(\\+?0?86\\-?)?1[345789]\\d{9}$"), TW("台湾", "^(\\+?886\\-?|0)?9\\d{8}$"), HK("香港", "^(\\+?852\\-?)?[569]\\d{3}\\-?\\d{4}$"), MS("马来西亚", "^(\\+?6?01){1}(([145]{1}(\\-|\\s)?\\d{7,8})|([236789]{1}(\\s|\\-)?\\d{7}))$"), PH("菲律宾", "^(\\+?0?63\\-?)?\\d{10}$"), TH("泰国", "^(\\+?0?66\\-?)?\\d{10}$"), SG("新加坡", "^(\\+?0?65\\-?)?\\d{10}$"), DZ("阿尔及利亚", "^(\\+?213|0)(5|6|7)\\d{8}$"), SY("叙利亚", "^(!?(\\+?963)|0)?9\\d{8}$"), SA("沙特阿拉伯", "^(!?(\\+?966)|0)?5\\d{8}$"), US("美国", "^(\\+?1)?[2-9]\\d{2}[2-9](?!11)\\d{6}$"), CZ("捷克共和国", "^(\\+?420)? ?[1-9][0-9]{2} ?[0-9]{3} ?[0-9]{3}$"), DE("德国", "^(\\+?49[ \\.\\-])?([\\(]{1}[0-9]{1,6}[\\)])?([0-9 \\.\\-\\/]{3,20})((x|ext|extension)[ ]?[0-9]{1,4})?$"), DK("丹麦", "^(\\+?45)?(\\d{8})$"), GR("希腊", "^(\\+?30)?(69\\d{8})$"), AU("澳大利亚", "^(\\+?61|0)4\\d{8}$"), GB("英国", "^(\\+?44|0)7\\d{9}$"), CA("加拿大", "^(\\+?1)?[2-9]\\d{2}[2-9](?!11)\\d{6}$"), IN("印度", "^(\\+?91|0)?[789]\\d{9}$"), NZ("新西兰", "^(\\+?64|0)2\\d{7,9}$"), ZA("南非", "^(\\+?27|0)\\d{9}$"), ZM("赞比亚", "^(\\+?26)?09[567]\\d{7}$"), ES("西班牙", "^(\\+?34)?(6\\d{1}|7[1234])\\d{7}$"), FI("芬兰", "^(\\+?358|0)\\s?(4(0|1|2|4|5)?|50)\\s?(\\d\\s?){4,8}\\d$"), FR("法国", "^(\\+?33|0)[67]\\d{8}$"), IL("以色列", "^(\\+972|0)([23489]|5[0248]|77)[1-9]\\d{6}"), HU("匈牙利", "^(\\+?36)(20|30|70)\\d{7}$"), IT("意大利", "^(\\+?39)?\\s?3\\d{2} ?\\d{6,7}$"), JP("日本", "^(\\+?81|0)\\d{1,4}[ \\-]?\\d{1,4}[ \\-]?\\d{4}$"), NO("挪威", "^(\\+?47)?[49]\\d{7}$"), BE("比利时", "^(\\+?32|0)4?\\d{8}$"), PL("波兰", "^(\\+?48)? ?[5-8]\\d ?\\d{3} ?\\d{2} ?\\d{2}$"), BR("巴西", "^(\\+?55|0)\\-?[1-9]{2}\\-?[2-9]{1}\\d{3,4}\\-?\\d{4}$"), PT("葡萄牙", "^(\\+?351)?9[1236]\\d{7}$"), RU("俄罗斯", "^(\\+?7|8)?9\\d{9}$"), RS("塞尔维亚", "^(\\+3816|06)[- \\d]{5,9}$"), R("土耳其", "^(\\+?90|0)?5\\d{9}$"), VN("越南", "^(\\+?84|0)?((1(2([0-9])|6([2-9])|88|99))|(9((?!5)[0-9])))([0-9]{7})$"); /** * 国际名称 */ private String national; /** * 正则表达式 */ private String regularExp; public String getNational() { return national; } public void setNational(String national) { this.national = national; } public String getRegularExp() { return regularExp; } public void setRegularExp(String regularExp) { this.regularExp = regularExp; } MobileRegularExp(String national, String regularExp) { this.national = national; this.regularExp = regularExp; } }

controller组件类

import com.galaxy.framework.core.constant.CommonConstant; import com.galaxy.platform.eapro.utils.MobileRegularExp; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.*; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * @author liuzy * @data 2020/5/25 * */ @RestController @RequestMapping(value = CommonConstant.ROOT_CONTEXT+"/rejudge") @Api(value = "/rejudge",description = "归属地判断") public class UserLoginController { @PostMapping("/rejudgeMobile") @ApiOperation("归属地判断") public boolean MobileNumber(String nationalCode, String mobileNumber){ boolean isMobileNumber = false; if (Strings.isNullOrEmpty(mobileNumber)){ return isMobileNumber; } for (MobileRegularExp regularExp : MobileRegularExp.values()) { Pattern pattern = Pattern.compile(regularExp.getRegularExp()); Matcher matcher = pattern.matcher(new StringBuilder().append(nationalCode).append(mobileNumber).toString()); if (matcher.matches()) { isMobileNumber = true; // 枚举中把最常用的国际区号拍在前面可以减少校验开销 break; } } return isMobileNumber; } }

实测演示: 在这里插入图片描述在这里插入图片描述实测错误演示: 在这里插入图片描述在这里插入图片描述 第三种:通过引入依赖jar包实现,综合以上方法个人感觉这个比较全面(这个是我从别人那学来的,原链接地址下次找到了贴出来),这是一个工具类直接调用即可。 jar包依赖地址:mvnrepository.com/

com.googlecode.libphonenumber libphonenumber 8.10.7 com.googlecode.libphonenumber geocoder 2.111 com.googlecode.libphonenumber carrier 1.101 com.googlecode.libphonenumber prefixmapper 2.140 package com.galaxy.platform.eapro.utils; import com.google.i18n.phonenumbers.PhoneNumberUtil; import com.google.i18n.phonenumbers.PhoneNumberToCarrierMapper; import com.google.i18n.phonenumbers.Phonenumber; import com.google.i18n.phonenumbers.geocoding.PhoneNumberOfflineGeocoder; import java.util.Locale; public class PhoneUtil { private static PhoneNumberUtil phoneNumberUtil = PhoneNumberUtil.getInstance(); private static PhoneNumberToCarrierMapper carrierMapper = PhoneNumberToCarrierMapper.getInstance(); private static PhoneNumberOfflineGeocoder geocoder = PhoneNumberOfflineGeocoder.getInstance(); /** * check phone * * @param phoneNumber * @param countryCode 国际区号码 eg:86 * @return the result "true" or "false" */ public static boolean checkPhoneNumber(String phoneNumber, Integer countryCode) { long phone = Long.parseLong(phoneNumber); Phonenumber.PhoneNumber pn = new Phonenumber.PhoneNumber(); pn.setCountryCode(countryCode); * @param countryCode pn.setNationalNumber(phone); * return phoneNumberUtil.isValidNumber(pn); * } * * /** * * 根据国家代码和手机号 判断手机运营商 * * @param phoneNumber * @return */ public static String getCarrier(String phoneNumber, Integer countryCode){ long phone = Long.parseLong(phoneNumber); Phonenumber.PhoneNumber pn = new Phonenumber.PhoneNumber(); pn.setCountryCode(countryCode); pn.setNationalNumber(phone); //返回结果只有英文,自己转成成中文 String carrierEn = carrierMapper.getNameForNumber(pn, Locale.ENGLISH); String carrierZh = ""; carrierZh += geocoder.getDescriptionForNumber(pn, Locale.CHINESE); switch (carrierEn) { case "China Mobile": carrierZh += "移动"; break; case "China Unicom": carrierZh += "联通"; break; case "China Telecom": carrierZh += "电信"; break; default: break; } return carrierZh; } /** * * @Description: 根据国家代码和手机号 手机归属地 * @param phoneNumber * @param countryCode * @return 参数 */ public static String getGeo(String phoneNumber, Integer countryCode){ long phone = Long.parseLong(phoneNumber); Phonenumber.PhoneNumber pn = new Phonenumber.PhoneNumber(); pn.setCountryCode(countryCode); pn.setNationalNumber(phone); return geocoder.getDescriptionForNumber(pn, Locale.CHINESE); } }

这三个方法均是后台实现,可以配合前台进行判断,今天介绍就到这,愿往后一起good good study,day day up!



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有