跳到内容

🔍 电话号码正则生成器 (30+ 国家)

即时生成 30+ 国家的电话号码验证正则表达式。四种变体 (E.164 / 国际 / 灵活 / 仅手机)、多国 OR 组合、实时测试器,以及 JavaScript / PHP / Python / Ruby / Go 的可复制代码片段。适用于表单验证、日志提取和数据清理。

完全免费 无需注册 浏览器内完成 5 种语言 深色模式

🔒 关于隐私

📝 生成的正则表达式

/^.+$/g

🧪 实时测试器

0 匹配
    0 未匹配

      💻 各语言代码片段

      
          

      📖 常见的坑

      为 30 多个国家生成电话号码校验用的正则表达式,提供 E.164 / 国际 / 宽松 / 仅移动四种变体、多国 OR 组合、可当场试验的测试器,以及 JavaScript / PHP / Python / Ruby / Go 的代码片段。处理全部在浏览器内完成。但正则能判定的只有「形状看上去像不像一个号码」——它无法告诉你这个号码是否真实存在、是否仍在使用、能否收到短信而且号码规划是会变的一旦分配了新的首位号段,昨天还正确的正则,今天就开始拒绝真实存在的号码。

      情形 会发生什么 怎么处理
      过于严格的正则会拒绝真实号码 号码体系由各国监管机构管理,每隔几年就会变动——移动号新增首位号段、固话区号被拆分、为新业务开辟新号段。把首位数字逐一枚举的正则,在写下的那一刻是准确的,随着时间推移就会开始拒绝真实号码。而且由于号码携带(携号转网)「这个号段是手机所以能收短信」这种推断已不再成立——号段与运营商的对应关系并不固定与此同时,被拒绝的用户在不明所以中流失——一个持有完全有效号码的人,被告知「您的号码无效」时,是无计可施的 正则只用来「拦掉明显不对的输入」。具体来说,限定在位数下限与上限、允许的字符集、国家码是否合理这个程度——逐一枚举前三位号段这件事,除非你准备好持续维护,否则不写更安全在需要准确性的场景(短信验证、实名核验、计费)请使用有人维护的库——libphonenumber 会持续跟进各国的号码规划,你没有理由把这份工作揽到自己身上要确认号码是否真的可达,唯一的办法就是真的发一次——一旦你通过短信发送验证码,正则的精度对最终验证结果就不再重要了
      在校验之前没有做归一化 人们会用许多种写法写同一个号码——带或不带连字符、用空格分隔、加括号、带或不带国家码、带或不带前导零,以及全角数字。从手机通讯录复制过来时,还可能夹带不可见的控制字符和特殊空格把原始字符串直接丢给正则,这些全都会判为「无效」——而输入的人根本看不出差别在哪全角与半角数字在许多字体里只差一个宽度)。另一个麻烦是国内写法与国际写法中的前导零——许多国家国内号码带前导 0,加上国家码时则要去掉这个 0若想两种都接受,就只能先统一成一种形式再比较。 请把顺序固定为「归一化 → 校验 → 存储」。归一化时,先把全角转半角(见 全角半角转换),再去掉数字与前导 + 之外的一切——仅此一步,上面列举的写法差异大半都被吸收了。校验针对归一化后的字符串进行,存储则统一为 E.164 形式(+ 加国家码,其后只有数字)——这种形式下,比较、去重、国际发送都可以直接使用展示时再按当地习惯排版即可。输入框里请允许连字符与空格——「请只输入数字」这种限制,不过是把归一化的工作推给了用户
      不同的正则引擎行为并不相同 这里的测试器跑在 JavaScript 引擎上,因此在这里通过的模式,未必在你粘贴过去的地方表现一致。有三处典型差异。Go 的 regexp 是 RE2,不支持前瞻((?=...))与反向引用——包含它们的模式在编译时就会报错PHP 的 preg_match 需要定界符,不用 /.../ 包起来就会告警且什么都匹配不到。锚点的含义也会浮动——在许多引擎中 $ 也会匹配到末尾换行之前,因此「号码后接换行再接其他文本」这样的输入可能蒙混过关JavaScript 与 Python 中需要用 \z / \Z,或先去除换行)。 生成的模式,请务必在你真正要用的语言里跑一次。尤其是 Go,它不是「行为不对」,而是「启动即崩溃」,没有测试就只能在生产环境里才发现。请准备三类测试用例应当通过的正常号码、应当拒绝的明显错误、以及边界(最短、最长、带与不带国家码)务必包含「应当被拒绝的输入」,这是关键——只测正常路径的话,一个来者不拒的坏模式同样会显示为绿色另外,不要把正则直接内联进代码,请给它命名并集中在一处——这样号码规划一变,需要修改的地方只有一个

      要严到什么程度,取决于这个号码用来做什么。如果是咨询表单里的可选项,严格校验只会减少咨询量——联系不上,吃亏的是填写者本人,你没有必要代替他们做判断。反过来,若是短信验证或配送联系人,发不出去就是立刻的业务失败,因此请把真实可达性的确认(发送验证码)纳入流程,而不是依赖格式校验用同一套严格度对待这两种情形,是最常见的设计错误。另外,电话号码属于个人信息——不要写进日志、不要放进错误信息、不要作为 URL 参数传给分析工具把用户尚未输完的值实时发给校验 API 的设计,尤其需要谨慎。还有,请避免只显示「无效」二字——写清楚需要几位、是否需要国家码,并给出示例,绝大多数输入错误当场就能解决。

      📖 使用方法

      1. 1
        选择目标国家
        可单选或多选 (OR 组合),支持 30+ 国家。
      2. 2
        选择变体
        可从 E.164/国际/灵活/仅手机 4 种中选择。
      3. 3
        复制或测试
        一键复制,实时测试器立即验证。
      4. 4
        粘贴到你的语言
        自动生成 JS/PHP/Python/Ruby/Go/Java 即用代码片段。

      ❓ 常见问题

      为什么不用 libphonenumber?
      libphonenumber-js 约 70KB,本工具用 30+ 国家规则零依赖输出。需完全精确请用 libphonenumber。
      国际格式和 E.164 区别?
      E.164 = 纯数字 (+819012345678),国际 = 带分隔符 (+81 90-1234-5678)。
      多国可以合一个正则?
      是。多选时用 | 组合为单个表达式。
      生成的正则完美吗?
      实用近似 (~80%)。银行级验证请用 libphonenumber。

      🔗 相关工具

      🐛 此工具出现问题了吗?

      免费、无需注册。仅提供复现步骤也有帮助。报告将直接发送给运营者并用于改进。

      ※ 为复现问题,浏览器信息 (UA / 屏幕 / 语言 / URL) 将自动发送