电话号码清洗库是否存在?

9
我希望能找到一个工具/库,可以将用户在网站中输入的自由格式电话号码解析成适合从指定国家拨打的号码。
这并不像一开始听起来那么简单。该网站允许世界各地的人以任何他们选择的方式输入他们的号码,因此许多人输入国内号码(另一个字段也提供了国家信息)。有些人用“+”输入国际号码,有些人则稍微不太正确地使用他们国家的国际前缀。
我想告诉这个库/工具我正在拨打电话的国家、自由格式的电话号码和可选的与之对应的国家(如果未输入,这将有助于生成国际代码),然后它会使用已知的模式最佳猜测适合我所在国家的号码。
例如,当从美国拨打英国号码时:
+44 (0) 1225-344567 => 011441225344567

或者从英国拨打美国号码:

(613) 4562342 => 0016134562342

有人知道任何(最好是.NET Framework友好的)解决方案,可以避免我无疑地重新发明轮子吗?


1
这样一个库听起来似乎非常独特。更不用说,没有任何标准规则。即使在同一个国家,如果你从手机向座机拨打电话,可能会有不同的号码格式!对于国际电话号码最好的解决方案,不幸的是,只能使用自由格式文本框。 - Mike Caron
1
谢谢。我们已经有了自由格式框。我已经将其链接到我们的电话系统中,这样人们就可以在不必(通常是错误地)将号码输入电话的情况下拨打客户电话。然而,我不得不实现一些自定义代码来处理上述示例中的数字……由于我们在美国和英国都有办事处,这使得这个问题更加困难,我想到可能已经有一些代码可以做到这一点(即使我们需要付费)——我有更重要的事情要做 ;) - Kram
类似于https://dev59.com/HnVC5IYBdhLWcg3wykQt的内容。 - borrible
我在 GitHub 上有一个 C# 库,提供了这个精确的功能。它使用嵌入式 XML 数据库来识别任何电话号码的上下文,并了解如何从任何一个号码拨打另一个号码。 - Ty H.
5个回答

8
我已经实现了这个功能,Mark。我在一个无线运营商工作,有一个国际短信发送应用程序。我不知道是否有第三方库实现了这些规则。如上所述,不能处理随机输入,因为电话号码格式在各个国家之间有所不同。一些国家,例如德国,区号和电话号码长度不固定。如果他们没有放入国家代码,你就会失败。然而,在我的情况下,如果缺少国家代码,我可以假设它是美国的电话号码。我的过滤器的结果对用户和输入非常准确。
我们可以进行一些假设,并通过了解目标受众、记录输入和分析来调整。我的第一个实现是为一个“白标签”Web应用程序而开发的,由世界各地的各种人用于测试。我很快发现,大多数外国人都很有条理,习惯于准标准的+格式。通常是美国人输入电话号码时最混乱。欧洲人非常习惯国际拨号。
第一个规则是除数字和前导“+”以外的所有内容都要删除。
如果结果数字少于8个,则是垃圾,请提供用户错误。
如果结果数字以“+”开头,则假定它是标准格式,并且下一个2-6位数字代表“国家代码”。找出国家代码,然后根据该国的规则处理剩余数字。
如果号码以0开头,则假定某人输入了一个国际访问前缀,并删除前导0和1,然后:
如果剩下的数字是10位数,则假定它是美国人输入的美国号码,并进行相应处理。如果剩下的数字不是10位数,但至少有8位数,则假定前2-6位数字是国家代码,查找国家代码,并根据该国的规则进行处理。
如果号码以1开头,并且总共有11个数字,则假定它是美国(或加勒比岛屿)的号码,并进行相应处理。
如果号码以1开头并且总共不是11个数字,则删除前导1,看看是否还剩下至少8个数字,并假定剩余的前导2到6个数字是国家代码,并根据该国的规则进行处理。
最后,对于不带+、0或1的号码,且至少有8位数字,则假定它是标准记法,即首先是国家代码,使用前2到6位数字作为国家代码,并根据该国的规则进行处理。
所有这些的诀窍在于拥有全球所有国家代码的映射以及每个国家的编号计划信息。我有这张地图和许多国家的规则。如果您需要这些信息,我很乐意分享,并提供一些C#代码来确定哪个国家。给我发消息吧。

在这方面的一个重要帮助是将你的软件猜测出的国家名称反馈给用户。如果用户试图输入德国电话号码,你的软件会询问他们是否想拨打关岛,用户会很快明白。


请问该怎样联系您,Christo?(我想要您的实现版本,它比我的更完整) - Peter Wone
@Peter说:“我在一个无线运营商工作”,所以这是日常工作的内容 - 很可能属于他的雇主,他不能把它给你(除非请求他们开源)。 - Rup

2

据我所知,这确实是最佳选择... 但是我也想用 .Net 实现... 刚刚发现了这个链接,声称可以完成此任务:http://blog.thekieners.com/2011/06/06/using-googles-libphonenumber-in-microsoft-net-with-c/ - Kram

1

0

没有,:) 管理国际电话号码的规则很少。一些国家甚至有多种表示方法。

例如,英国有可变大小的区号:

  • 0121 = 伯明翰
  • 01223 = 剑桥

0
有一种国际(和国家)电话号码的“标准”格式。它们看起来像这样:+31 42 123 4567(+国家前缀号码呼叫)。示例取自维基百科。尽管您不应该期望任何人以这种方式输入它。根据我的经验,用户最有可能坚持他们习惯的格式。
我不知道是否有任何库可以在所有(主要是本地的)表示之间转换为我提到的或任何其他格式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接