德国电话号码格式的正则表达式

Posted

技术标签:

【中文标题】德国电话号码格式的正则表达式【英文标题】:Regexp for german phone number format 【发布时间】:2017-05-23 03:46:52 【问题描述】:

我尝试从德语格式的字符串中获取电话号码。但我没有让它完全运行。输入文本是一个包含大量内容的完整 html 页面,而不仅仅是数字。

可能的格式:

(06442) 3933023     
(02852) 5996-0       
(042) 1818 87 9919   
06442 / 3893023  
06442 / 38 93 02 3     
06442/3839023
042/ 88 17 890 0     
+49 221 549144 – 79  
+49 221 - 542194 79  
+49 (221) - 542944 79
0 52 22 - 9 50 93 10 
+49(0)121-79536 - 77 
+49(0)2221-39938-113 
+49 (0) 1739 906-44  
+49 (173) 1799 806-44
0173173990644
0214154914479
02141 54 91 44 79
01517953677
+491517953677
015777953677
02162 - 54 91 44 79
(02162) 54 91 44 79

我试过了:

$regex =  '~(?:\+?49|0)(?:\s*\d3)2\s*\d4,10~';
if(preg_match_all($regex, $input_imprint , $matches))
    print_r($matches);

但它不仅仅匹配少数几种格式。我不知道该怎么做。

【问题讨论】:

【参考方案1】:

这是一个匹配所有格式的正则表达式。 我建议然后替换所有不需要的字符,然后你就得到了你想要的结果。

(\(?([\d \-\)\–\+\/\(]+)\)?([ .\-–\/]?)([\d]+))

如果您需要最小长度来匹配您的号码,请使用:

(\(?([\d \-\)\–\+\/\(]+)6,\)?([ .\-–\/]?)([\d]+))

https://regex101.com/r/CAVex8/143

已更新,感谢@Willi Mentzel 的建议

【讨论】:

第二个减号将被解释为“直到”。您应该将其遮盖以避免不必要的匹配。 (\(?([\d \-\)\–\+\/\(]+)6,\)?([ .\-–\/]?)([\d]+)) 我们在使用它时注意到了它:D。好答案 为什么要转义字符类中的所有字符?为什么要放两次连字符?这使您的正则表达式不可读。此外,([\d \-\)\–\+\/\(]+)6, 中的双量词 +6, 没有意义。 小心这个验证也匹配+-+++49 (173) 1799 806-44【参考方案2】:
[0-9]*\/*(\+49)*[ ]*(\([0-9]+\))*([ ]*(-|–)*[ ]*[0-9]+)*

查看此链接:https://regex101.com/r/CAVex8/1

可能会引入一些误报。

【讨论】:

【参考方案3】:

这个解决了我的问题(从电子邮件中提取电话号码):

r"\+?[0-9]+([0-9]|\/|\(|\)|\-| )10,"

前面可选加号,后跟至少 1 个数字,后跟至少 10 个数字或分隔字符,例如 /()- 或空格。 (电话号码没有官方的“最小位数”,但我认为它们都至少有 11 位)

我添加这个是因为 @Kakul 的解决方案与我的文本的任何留置权相匹配,并且使用 @despecial 的我的代码不会终止。 (我猜这对我的电脑来说计算成本太高了)

【讨论】:

【参考方案4】:

这不是问题的解决方案,只是匹配电话号码的建议!

如果您是第一次为自己存储电话号码,请限制接受的不同格式的数量。例如,摆脱这些:

(06442) 3933023
042/ 88 17 890 0
+49(0)121-79536 - 77
02162 - 54 91 44 79

为什么? 您需要测试更多可能的输入无效值的方法。

你绝对需要根据DIN 5008考虑的格式:

0873 376461
03748 37682358
05444 347687-350
0764 812632-41
0180 2 12334
0800 5 23234213
+49 30 3432622-113
0179 1111111

这是我想出的:Regex

^(([+]1[1-9]1[0-9]0,2[ ]1([1-9]1[0-9]1,4)1[ ]1([1-9]1[0-9]2,6)1([ -][0-9]1,5)?)|([0]1[1-9]1[0-9]1,4[ ]1[0-9]1,8([ -][0-9]1,8)?)?)

正面:

06429 1111
06901 306180
06429 231
0800 3301000
0179 1111111
0873 376461
03748 37682358
05444 347687-350
0764 812632-41
0180 2 12334
0800 5 23234213
+49 6429 1111
+49 39857 2530
+55 11 2666-0054
+300 11 2666-0054
+49 641 20106 0
+49 641 20106
+49 30 3432622-113

否定:

++49 157 184977
+300 11 0000-0000
(06442) 3933023
(02852) 5996-0
(042) 1818 87 9919
06442 / 3893023
06442 / 38 93 02 3
06442/3839023
042/ 88 17 890 0
+49 221 - 542194 79
+49 (221) - 542944 79
0 52 22 - 9 50 93 10
+49(0)121-79536 - 77
+49(0)2221-39938-113
+49 (0) 1739 906-44
+49 (173) 1799 806-44
0173173990644
0214154914479
01517953677
+491517953677
015777953677
02162 - 54 91 44 79
(02162) 54 91 44 79
saddsadasdasd
asdasd
asdasd asdasd asd
asdasd
kjn asohas  asdoiasd
23434 234 234 23
323
23434 234----234
///// ----
// id8834 3493934 //

【讨论】:

以上是关于德国电话号码格式的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

如何用数字对正则表达式德国街道地址(中缀)

判断手机号正则表达式

在没有正则表达式的情况下验证具有不同格式的电话号码

使用正则表达式的电话号码格式的knockout绑定处理程序

如何在 vim 命令中使用正则表达式格式化电话号码列表?

使用正则表达式将数字转换为电话格式