想问下都是怎么校验手机号的?

166 天前
 jackshen

背景:有一些需要接入国际化手机号的业务,在录入过程中校验手机号码格式以及解析区域信息

目前采用方案:使用 Google 开源的 libphonenumber 工具包

遇到的问题: 区域校验不准确,+1 开头的地区有好多无法区分,例如:+18888888888 这个美国和加拿大都验证通过

1798 次点击
所在节点    程序员
7 条回复
dabao
166 天前
美加 格式一样啊
383394544
166 天前
北美一票国家都是 +1 开头,要靠后面的区号来区分。
gucheen
166 天前
标准做法不是让用户主动选地区吗?
jackshen
166 天前
@gucheen 如果用户主动选择的地区和手机号格式不匹配呢?
jackshen
166 天前
@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);
}
```
zhmouV2
165 天前
不太理解,前端一般不都是国家或地区(区号)选择框和用户输入的(不带区号)的手机号分开的吗?
为什么要拿字符串去 parse?
zhmouV2
165 天前
对于上面用户自己选了个不匹配的问题,当然是用户自己对自己的输入负责吧=。=

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1121128

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX