从电话号码拉出分机

时间:2017-02-23 15:00:53

标签: php regex

我正在寻找一个php / regex解决方案,以便从下面列出的数据示例中获取电话分机。

+49 (0) 1111 807 111 (Ext 1012)
+49 (0) 1111 807 111 (Ext1012)
+49 (0) 1111 807 111 [Ext 1012]
+49 (0) 2222 807 111 <Ext 1012>
+49 (0) 2222 807 111 <Ext1012>
+49 (0) 2222 807 111 <1012>
+49 (0) 2222 807 111 [1012]

任何帮助都将不胜感激。

4 个答案:

答案 0 :(得分:2)

从-5到-1

回显字符串的一部分
echo substr($number, -5, -1);

代表'+49(0)1111 807 111(分机1012)',它返回'1012'

答案 1 :(得分:2)

如果第一组字符始终相同,则不需要正则表达式。获取字符串的长度并获取其中的前21个字符(包括扩展名开头的空格)。找出构成扩展和子串的位置数。

我的意思是: +49(0)1111 807 111(分机1012) 说那是$string = "+49 (0) 1111 807 111 (Ext 1012)";

$ length = strlen($ string)将为您提供31。

移除到扩展名会给你20(位置19是空格。所以21-30的任何内容都是扩展名。

echo $string[21].$string[22].$string[23].....$string[30];

或者您可以使用substr并获得结束位置。使用 - 从1反向计数。

echo substr($string,-5,-1);

答案 2 :(得分:1)

你可以试试这个:

/(\(Ext|(\[|<)(Ext)?)\s*(\d+)(\)|>|])/

第一部分将捕获:

$phones = '
+49 (0) 1111 807 111 (Ext 1012)
+49 (0) 1111 807 111 (Ext1012)
+49 (0) 1111 807 111 [Ext 1012]
+49 (0) 2222 807 111 <Ext 1012>
+49 (0) 2222 807 111 <Ext1012>
+49 (0) 2222 807 111 <1012>
+49 (0) 2222 807 111 [1012]
';

preg_match_all('/(\(Ext|(\[|<)(Ext)?)\s*(\d+)(\)|>|])/', $phones, $matches);

$ {匹配的var_dump将为您提供一个阵列,您对第四个捕获组感兴趣。

array(7) {
    [0]=> string(4) "1012"
    [1]=> string(4) "1012"
    [2]=> string(4) "1012"
    [3]=> string(4) "1012"
    [4]=> string(4) "1012"
    [5]=> string(4) "1012"
    [6]=> string(4) "1012"
}

答案 3 :(得分:1)

您可以使用以下正则表达式(使用positive lookahead / lookbehind从电话号码中获取所有扩展程序:

(?<=\d{3}\s[\(\[<]).*?(?=\)|\]|>)

input        >>  +49 (0) 1111 807 111 (Ext 1012)
regex search >>  (?<=\d{3}\s[\(\[<]).*?(?=\)|\]|>)
output       >>  Ext 1012

请参阅demo / explanation

<强> PHP

$re = '/(?<=\d{3}\s[\(\[<]).*?(?=\)|\]|>)/';
$str = '+49 (0) 1111 807 111 (Ext 1012)
        +49 (0) 1111 807 111 (Ext1012)
        +49 (0) 1111 807 111 [Ext 1012]
        +49 (0) 2222 807 111 <Ext 1012>
        +49 (0) 2222 807 111 <Ext1012>
        +49 (0) 2222 807 111 <1012>
        +49 (0) 2222 807 111 [1012]';

preg_match_all($re, $str, $matches);
print_r($matches);