剥离电话号码(手机)

Stripping down Phonenumber (mobile)

是否有将 phone 数字简化为特定格式的函数或简单方法?

输入可以是数字(手机,不同国家代码)

也许

+4917112345678
+49171/12345678
0049171 12345678

或者可能来自其他国家

004312345678
+44...

我在做

$mobile_new = preg_replace("/[^0-9]/","",$mobile);  

杀死数字以外的所有内容,因为我需要 49171 格式(开头没有 + 或 00),但我需要处理是否先插入 00 或者有人使用 +49(0 )171 or or 输入一个 0171 (需要是 49171.

所以第一个数字总是需要是没有 +/00 且之间没有任何 (0) 的乡村。

有人可以就如何解决这个问题给我建议吗?

此模式 (49)\(?([0-9]{3})[\)\s\/]?([0-9]{8}) 会将号码分成三组:

  • 49 - 国家代码
  • 3 位数字 - 区号
  • 8 位数字 - 数字

比赛结束后,您可以通过 .

连接它们来构造干净的数字

演示:https://regex101.com/r/tE5iY3/1

如果这不适合您,请更准确地解释您想要的测试输入和预期输出。

您可以使用

(?:^(?:00|\+|\+\d{2}))|\/|\s|\(\d\)

以匹配您的大多数案例,并简单地用任何东西替换它们。例如:

$mobile = "+4917112345678";
$mobile_new = preg_replace("/(?:^(?:00|\+|\+\d{2}))|\/|\s|\(\d\)/","",$mobile);
echo $mobile_new;
//output: 4917112345678

regex101 Demo

解释:

我在这里利用了OR,一一匹配你的每一个案例:

  1. (?:^(?:00|\+|\+\d{2})) 匹配 00++ 后跟字符串开头的两个数字
  2. \/ 匹配字符串中任意位置的 /
  3. \s 匹配字符串中任意位置的空格(它匹配 regex101 演示中的换行符,但我想你自己匹配每个数字)
  4. \(\d\) 匹配字符串中任意位置括号中的数字

此正则表达式未涵盖的唯一情况是输入格式 01712345678,因为您只能猜测特定国家/地区的前缀是什么。如果您希望它默认为 49,则只需将每个以单个 0 开头的输入替换为 49:

$mobile = "01712345678";
$mobile_new = preg_replace("/^0/","49",$mobile);
echo $mobile_new;
//output: 491712345678

我建议查看 Google 的 LibPhoneNumber 及其 PHP 的端口。 它支持多种格式和国家,并且维护良好。最好不要自己弄清楚。

https://github.com/giggsey/libphonenumber-for-php

$phoneUtil = \libphonenumber\PhoneNumberUtil::getInstance();
$usNumberProto = $phoneUtil->parse("+1 650 253 0000", "US");