🔍 电话号码正则生成器 (30+ 国家)
即时生成 30+ 国家的电话号码验证正则表达式。四种变体 (E.164 / 国际 / 灵活 / 仅手机)、多国 OR 组合、实时测试器,以及 JavaScript / PHP / Python / Ruby / Go 的可复制代码片段。适用于表单验证、日志提取和数据清理。
完全免费
无需注册
浏览器内完成
5 种语言
深色模式
🔒 关于隐私
- ・所有处理均在浏览器中 (JavaScript) 完成
- ・您输入的电话号码不会发送到任何服务器
📝 生成的正则表达式
/^.+$/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
选择目标国家可单选或多选 (OR 组合),支持 30+ 国家。
-
2
选择变体可从 E.164/国际/灵活/仅手机 4 种中选择。
-
3
复制或测试一键复制,实时测试器立即验证。
-
4
粘贴到你的语言自动生成 JS/PHP/Python/Ruby/Go/Java 即用代码片段。
❓ 常见问题
为什么不用 libphonenumber?
libphonenumber-js 约 70KB,本工具用 30+ 国家规则零依赖输出。需完全精确请用 libphonenumber。
国际格式和 E.164 区别?
E.164 = 纯数字 (+819012345678),国际 = 带分隔符 (+81 90-1234-5678)。
多国可以合一个正则?
是。多选时用 | 组合为单个表达式。
生成的正则完美吗?
实用近似 (~80%)。银行级验证请用 libphonenumber。
🐛 此工具出现问题了吗?
免费、无需注册。仅提供复现步骤也有帮助。报告将直接发送给运营者并用于改进。
✅
感谢您的反馈!
已送达运营者,将用于改进工具。