V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
jackshen
V2EX  ›  程序员

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

  •  
  •   jackshen · 1 天前 · 1003 次点击

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

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

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

    7 条回复    2025-03-27 11:43:18 +08:00
    dabao
        1
    dabao  
       1 天前
    美加 格式一样啊
    383394544
        2
    383394544  
       1 天前
    北美一票国家都是 +1 开头,要靠后面的区号来区分。
    gucheen
        3
    gucheen  
       1 天前
    标准做法不是让用户主动选地区吗?
    jackshen
        4
    jackshen  
    OP
       1 天前
    @gucheen 如果用户主动选择的地区和手机号格式不匹配呢?
    jackshen
        5
    jackshen  
    OP
       1 天前
    @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
        6
    zhmouV2  
       8 小时 53 分钟前
    不太理解,前端一般不都是国家或地区(区号)选择框和用户输入的(不带区号)的手机号分开的吗?
    为什么要拿字符串去 parse?
    zhmouV2
        7
    zhmouV2  
       8 小时 52 分钟前
    对于上面用户自己选了个不匹配的问题,当然是用户自己对自己的输入负责吧=。=
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3167 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 12:35 · PVG 20:35 · LAX 05:35 · JFK 08:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.