我正在寻找一个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]
任何帮助都将不胜感激。
答案 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
<强> 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);