德国电话号码格式的正则表达式
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 //
【讨论】:
以上是关于德国电话号码格式的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章