背景:有一些需要接入国际化手机号的业务,在录入过程中校验手机号码格式以及解析区域信息
目前采用方案:使用 Google 开源的 libphonenumber 工具包
遇到的问题: 区域校验不准确,+1 开头的地区有好多无法区分,例如:+18888888888 这个美国和加拿大都验证通过
![]() |
1
dabao 1 天前
美加 格式一样啊
|
![]() |
2
383394544 1 天前
北美一票国家都是 +1 开头,要靠后面的区号来区分。
|
![]() |
3
gucheen 1 天前
标准做法不是让用户主动选地区吗?
|
5
jackshen OP @dabao
@383394544 是的,北美一票国家都是 +1 开头,但是号码(+18888888888)解析出来时是 US ,然后使用这个方法`com.google.i18n.phonenumbers.PhoneNumberUtil#isValidNumberForRegion`校验传 CA 也依然校验通过 代码: ``` public static void main(String[] args) { String str = "+18888888888"; System.out.println(validPhoneNumber(str, "CA")); } public static boolean validPhoneNumber(String mobile, String region) { PhoneNumberUtil instance = PhoneNumberUtil.getInstance(); Phonenumber.PhoneNumber phoneNumber; try { phoneNumber = instance.parse(mobile, "CN"); } catch (NumberParseException e) { log.warn("手机号校验不通过 phoneNum:<{}> errMsg:<{}>", mobile, e.getMessage()); return false; } if (StringUtils.hasText(region)) { return instance.isValidNumberForRegion(phoneNumber, region); } return instance.isValidNumber(phoneNumber); } ``` |
6
zhmouV2 11 小时 9 分钟前
不太理解,前端一般不都是国家或地区(区号)选择框和用户输入的(不带区号)的手机号分开的吗?
为什么要拿字符串去 parse? |
7
zhmouV2 11 小时 8 分钟前
对于上面用户自己选了个不匹配的问题,当然是用户自己对自己的输入负责吧=。=
|