如何将手机号码分成国家代码,区号和本地号码?

如何将手机号码分成国家代码,区号和本地号码? 分裂后为+919567123456

国家代码= 91

区号= 9567

当地号码= 123456

使用简单的算法解析电话号码是不可能的,您需要使用填充了每个国家/地区规则的数据表 – 因为每个国家/地区都以不同的方式划分电话号码。

国家代码相当简单,只需使用维基百科中国家/地区呼叫代码文章中的数据,并构建一个包含所有唯一国家/地区代码的表格。 每个国家/地区都有一个独特的前缀,因此很容易。

但是,您需要查找要支持的每个国家/地区的规则,并使用每个国家/地区的规则提取区号。

不要维护自己的所有这些数据表! 使用“Java International Phone Number Utilities library v3.0”, https://github.com/googlei18n/libphonenumber 。 这就是Google使用的,Google会为您维护它!

正如各种人所提到的,你不能通过简单的字符串匹配来做到这一点。 既不是国家也不是地区代码的长度是固定的。

在过去完成此操作后,我们维护了一个类似于以下结构的表格: –

 + ------------ + --------- + ------- + -------------- +
 | country_code | area_code | country | area |
 + ------------ + --------- + ------- + -------------- +
 | 44 | 1634 |英国|梅德韦|
 | 44 | 20 |英国|伦敦|
 | 964 | 23 |伊拉克|瓦西特(Al Kut)|
 | 964 | 2412 |伊拉克|虚幻|
 + ------------ + --------- + ------- + -------------- +

然后,我们计算了area_code和country_code的最大长度,并通过从最大长度开始的子串,检查字符串,然后向下工作,直到找到匹配为止。

所以给出了号码441634666788

我们可以从子串[1,7]开始(7是最长的国家/地区代码组合的长度),找不到匹配,然后转到[1,6]并找到匹配的英国/梅德韦。

效率不高但有效。

编辑

你也可以尝试这样的东西,但是你需要用完整的数据集进行测试,或者甚至可以将它分解为单独的国家和地区代码选择,因为它可能不是很适合你选择的数据库。

DECLARE @area_codes TABLE ( country_code VARCHAR(10), area_code VARCHAR(10), country VARCHAR(20), area VARCHAR(20), match_string VARCHAR(MAX), match_length INTEGER ) INSERT INTO @area_codes VALUES ('44','1382','UK','Dundee', '441382%', 6) INSERT INTO @area_codes VALUES ('44','1386','UK','Evesham', '441386%', 6) INSERT INTO @area_codes VALUES ('44', '1', 'UK', 'Geographic numbers', '441%', 3) DECLARE @number VARCHAR(MAX) SET @number = '441386111111' SELECT TOP 1 * FROM @area_codes WHERE @number LIKE match_string ORDER BY match_length DESC 

您将通过触发器维护match_string和match_length字段,注意处理空区域代码并在match_string列上索引该表。

我想你需要像国家和地区代码的dictonary。 因为他们的摊位可以有不同的长度。 美国+1,德国+49,甚至+6723。 与Areacodes相同..

答案很大程度上取决于国家。 没有通用规则说“这是国家代码,这是区号,这是本地号码”。 普遍可以获得的唯一信息是国家号码(甚至可以是1-4位数字); 那么你需要咨询具体国家的规则集。

例如(例如,“给定国家/地区有许多不同的电话号码,但它们都遵循相同的格式 ”):

  • +420123456789是捷克共和国的一个(虚假)号码(国家代码+420),其余的是本地号码(有些国家使用未划分的寻址空间,尽管您可以从前1-4位数字推断出一些数据位当地号码(例如“+420800是免费电话号码”))。 因此,解析此数字的唯一有用方法分为两部分,+ 420 123456789
  • +18005551234在美国是一个(可能也是假的)号码; 根据北美编号方案 ,+1是国家代码,800是区号(免费号码),555是交换代码,1234是本地号码。 然后,您可以将数字解析为四个部分,即+1 800 555 1234

如果您要求准确的英国数据,请参阅http://code.google.com/p/ofcom-csverter/以获取更正英国区号的完整列表。

一个非常复杂的问题。 首先,您需要确定国家/地区代码 。 根据国家/地区代码,其余部分必须分为区号和本地号码。 但这三个部分都没有固定的长度,不是孔数,也不是区号和局部组合!

示例:4930123456789

  • 49是德国的国家代码
  • 30是柏林的区号
  • 123456789是柏林的本地地址(不是真实的一个)

示例:493328123456

  • 49是德国的国家代码
  • 3328是Teltow的区号
  • 123456是Teltow的本地电话号码(没有真实的)

示例:34971123456

  • 34是西class牙的国家代码
  • 971是马略卡岛的区号
  • 123456是马略卡岛上的本地号码(没有真实的)