确定美国的本地/国际电话号码

Determining local / international phone numbers for the US

提问人:RichW 提问时间:12/5/2010 最后编辑:KaraRichW 更新时间:6/11/2014 访问量:2917

问:

你可能认为这个问题以前已经被问过一百万次了,但我认为我的问题有点不同。大多数电话号码验证请求都用于验证用户输入。在我的方案中,我正在尝试验证美国移动电话的来电,并确定他们是从另一个国家/地区还是从美国境内拨打。

我的主要问题是我在英国,没有美国电话号码的经验。我已经阅读了有关如何拨号等格式(国际和国内),但我担心的是电话号码在收件人的电话上以不同的方式显示,并且格式多种多样。

这是我尝试执行的操作的规范。.

  • 想象一下,您居住在美国,正在通过手机接听电话
  • 确定呼叫是来自美国还是其他国家/地区
  • 在英国,电话可以以本地或国际格式出现,它应该能够确定它是否是美国号码
  • 我相信国际电话可以以 0044 或 +44 格式显示在您的手机上(如果您从英国拨打美国)
  • 如果电话来自美国境内,是否为有效电话号码?
  • 去除所有非数字字符并重新格式化为国家格式。例如,英国号码 01530 123123将重新格式化为 01530123123
  • 去除所有非数字字符并重新格式化为国际格式。例如,英国号码 01530 123123将重新格式化为 00441530123123

我正在尝试用PHP编写代码并避免使用正则表达式。我认为它可以使用 substr() 来分解数字的一部分。

关于如何做到这一点、代码片段或示例电话号码的任何想法?我真的希望来自美国的人能够启发我电话号码格式等。

PHP 电话号码

评论


答:

1赞 user330315 12/5/2010 #1

据我所知,如果数字“跨境”,它们总是以国家代码为前缀,因此检查 +1 或 001 来识别美国号码应该非常安全。

但是,仅仅因为您接到一个带有美国号码的电话,并不意味着该电话来自美国。它可能是位于世界任何地方的手机。

评论

0赞 RichW 12/5/2010
对不起,我的措辞可能有点糟糕,设备的位置无关紧要。如果是从其他国家/地区拨打的美国手机,则可以被识别为从美国境内拨打的美国电话号码。无论如何,感谢您提供的信息。使用 +1 或 001 识别它对于国际来说很好,但对本地号码有什么想法吗?
1赞 12/5/2010
如果号码不以国际国家/地区代码开头,则必须是来自接收者所在国家/地区的“本地”呼叫。请注意,反之亦然。
1赞 El Yobo 12/12/2010
实际上,如果该号码是从澳大利亚拨出到其他任何地方的澳大利亚人,那将不起作用。出于某种奇怪的原因,您必须拨打 0011 才能离开 - 所以美国是 00111...,而新西兰是001164......;基本上,001 将匹配来自澳大利亚的每个国际电话,除非他们使用 +1 语法。
2赞 borrel 12/9/2010 #2

这样就可以了

<?php
/**
  * function isUsPhone
  * {arg} $num string the number
  * {returns} bool
**/
function isUsPhone($num){ 
// for au use this 
// foreach(array('+', '0011') as $c){
foreach(array('+', '00') as $c){
 if(substr($num,0,strlen($c)+1) == $c.'1'){
  foreach(
   array(
    205, 251, 256, 334, 659, 938, 907, 250, 480, 520, 602, 623, 928, 327, 479, 501, 870, 209, 213, 310, 323, 341, 369, 408, 415, 424, 442, 510, 530, 559, 562, 619, 626, 627, 628, 650, 657, 661, 669, 707, 714, 747, 760, 764, 805, 818, 831, 858, 909, 916, 925, 935, 949, 951 , 303, 719, 720, 970 , 203, 475, 860, 959, 302, 202, 239, 305, 321, 352, 386, 407, 561, 689, 727, 754, 772, 786, 813, 850, 863, 904, 941, 954 , 229, 404, 470, 478, 678, 706, 762, 770, 912 , 808, 208, 217, 224, 309, 312, 331, 447, 464, 618, 630, 708, 730, 773, 779, 815, 847, 872, 219, 260, 317, 574, 765, 812, 319, 515, 563, 641, 712 , 316, 620, 785, 913, 270, 364, 502, 606, 859, 225, 318, 337, 504, 985, 207, 227, 240, 301, 410, 443, 667, 339, 351, 413, 508, 617, 774, 781, 857, 978 , 231, 248, 269, 313, 517, 586, 616, 679, 734, 810, 906, 947, 989 , 218, 320, 507, 612, 651, 763, 952, 228, 601, 662, 769, 314, 417, 557, 573, 636, 660, 816, 975, 406, 308, 402, 531, 702, 775, 603, 201, 551, 609, 732, 848, 856, 862, 908, 973 , 505, 575, 212, 315, 347, 516, 518, 585, 607, 631, 646, 716, 718, 845, 914, 917, 929 , 252, 336, 704, 828, 910, 919, 980, 984 , 701, 216, 234, 283, 330, 380, 419, 440, 513, 567, 614, 740, 937, 405, 539, 580, 918, 458, 503, 541, 971, 215, 267, 272, 412, 445, 484, 570, 582, 610, 717, 724, 814, 835, 878 , 401, 803, 843, 864, 605, 423, 615, 731, 865, 901, 931, 210, 214, 254, 281, 325, 361, 409, 430, 432, 469, 512, 682, 713, 737, 806, 817, 830, 832, 903, 915, 936, 940, 956, 972, 979 , 385, 435, 801, 802, 276, 434, 540, 571, 703, 757, 804 , 206, 253, 360, 425, 509, 564, 304, 681, 262, 274, 414, 534, 608, 715, 920, 307
   ) as $a
  ){
   if(substr($num,strlen($c)+1,3) === (string) $a){
    echo "\n".substr($num,strlen($c)+1,3)."\n";
    return true;
    }
  }
  }
}
return false;
}
var_dump(isUsPhone('+18003343423'));
?>

“我们”就是现在的我们 这是一个免费、免费或特殊号码

根据 Wikipedia B.T.W. 因为您有一个英国号码,我们将永远有一个前缀 (否则调用本身将无法进行)

1赞 guinoise 12/11/2010 #3

如果它以 + 开头,而不是以 1 开头,或者它以 011 开头,则它是“国际”的。其他它是“国家”的。

但是,这里的“国家”是指北美而不是美利坚合众国。在您的情况下,差异可能很重要。如果您真的需要知道它是美国而不是北美,您必须检查区域代码。在北美,电话号码的组成方式是这样的 +1 (AAA) NNN-NNNN 其中 AAA 是区号。这个区号可以告诉你它来自哪里。

您可以在此处获取区号列表 http://en.wikipedia.org/wiki/List_of_North_American_Numbering_Plan_area_codes 。请注意,当分配区号时,它将始终处于此分配处,但将来可能会添加一些区号。

编辑:区号 800、822、833、844、855、866、877、880 到 882、888 表示免费电话(或为将来扩展免费电话而保留),不能比北美更精确。关于这些数字,您唯一可以确定的是,它们在北美是免费的。

0赞 Developer 12/13/2010 #4

本地号码以区号开头,有些具有特殊意义,如 555 或 800,并且总数始终相同。有些可能由电话用户输入为类似于 800CALLNOW 的 alpha 文本,您将不会收到该格式的国际电话。关于您的项目,您需要成为授权和注册的移动网络运营软件工程师,并为设备使用标准代码模块或收集有关呼叫的统计信息,并且您通常不需要了解您询问的细节,因为过滤将在该模块中完成,您所需要的只是将变量输出为参数。请求这项工作的美国组织需要向您提供可能遇到的任何特定号码格式的规范,以及国家电信监管机构的文件,假设该工作可以在美国境外完成。如果他们没有提供细节,或者如果被要求不能提供,那么项目的这一部分就无法令人满意地完成。

3赞 Andrew White 12/14/2010 #5

那些说只寻找 +1 的人对电话号码没有太多使用。1 国家/地区代码适用于北美的许多地区,而不仅仅是美国。因此,真正需要发生的是围绕北美编号方案和北美编号方案区号列表中列出的表格的一些逻辑

以下是一些“特殊”国家的简短列表,这些国家/地区的数字以 +1 开头,但并非基于美国。

百慕大:

  • 1995 年后:+1 441 (xxx) xxxx

波多黎各:

  • 2001年后:+1 787 xxx xxxx 或 +1 939 xxx xxxx(覆盖整个岛屿)

美属维尔京群岛:

  • 1997 年以后:+1 340 xxx xxxx

北马里亚纳群岛:

  • 1997 年之后:+1 670 xxx xxxx

关岛:

  • 1997 年后:+1 671 xxx xxxx

美属萨摩亚:

  • 2004 年 10 月 2 日之后:+1 684 xxx xxxx

圣马丁岛:

  • 加入NANP后:+1 721 xxx xxxx(日期待定)

评论

2赞 Alexandre C. 12/14/2010
加拿大的数字也有+1。
1赞 Andrew White 12/14/2010
哦,是的,我知道,这就是为什么我说“一些特殊的数字”。完整列表在第二个链接中概述。
0赞 Chris Ismael 3/1/2013 #6

您可以尝试此 API,当您提供美国号码时,它会为您提供多种电话号码格式。由此您可以判断它是否是美国号码。以 JSON https://www.mashape.com/parsify/format#endpoint-Phone-Number 返回结果

评论

0赞 Andrew Barber 3/1/2013
感谢您发布您的答案!请务必仔细阅读有关自我推销的常见问题。另请注意,每次链接到您自己的网站/产品时,您都必须发布免责声明。
0赞 MB34 4/11/2014 #7

我们已经开始使用 Google 的 libphonenumber 库。它允许您根据多种国际格式设置电话号码的格式。

这里有一个PHP端口:https://github.com/davideme/libphonenumber-for-PHP