0

是否有将电话号码剥离为特定格式的功能或简单方法?

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

也许

+4917112345678
+49171/12345678
0049171 12345678

或者可能来自另一个国家

004312345678
+44...

我在做一个

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

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

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

有人可以给我一个关于如何解决这个问题的建议吗?

4

3 回答 3

0

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

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

匹配后,您可以构造干净的数字,只需将它们连接起来\1\2\3

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

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

于 2015-02-06T10:28:25.600 回答
0

您可以使用

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

匹配您的大多数情况,只需将它们替换为空。例如:

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

正则表达式101演示

解释:

我在OR这里使用,一一匹配您的每个案例:

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

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

$mobile = "01712345678";
$mobile_new = preg_replace("/^0/","49",$mobile);
echo $mobile_new;
//output: 491712345678
于 2015-02-06T10:38:15.833 回答
0

我建议看一下 Google 的 LibPhoneNumber 及其 PHP 端口。它支持多种格式和国家,并且维护良好。最好不要自己解决这个问题。

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

$phoneUtil = \libphonenumber\PhoneNumberUtil::getInstance();
$usNumberProto = $phoneUtil->parse("+1 650 253 0000", "US");
于 2015-02-06T11:35:42.703 回答