剥离Phonenumber(移动)

时间:2015-02-06 10:10:32

标签: php regex replace preg-replace stripping

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

输入可以是数字(移动,不同的国家/地区代码)

也许

+4917112345678
+49171/12345678
0049171 12345678

或者来自其他国家/地区

004312345678
+44...

我正在做一个

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

杀死除了数字以外的所有内容,因为我需要格式为49171(开头没有+或00),但我需要处理如果首先插入00或者某人使用+49(0)171或者输入0171(需要49171。

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

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

3 个答案:

答案 0 :(得分:0)

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

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

匹配后,您可以构建干净的数字,只需按\1\2\3连接它们。

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

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

答案 1 :(得分:0)

您可以使用

(?:^(?: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. 中任意位置的/
  4. \s匹配字符串中任意位置的空格(它与regex101演示中的换行符匹配,但我认为您自己匹配每个号码)
  5. \(\d\)匹配字符串
  6. 中任意位置括号中的数字

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

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

答案 2 :(得分:0)

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

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

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