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

4
您可能认为这个问题已经被问了无数次,但我认为我的问题有些不同。大多数电话号码验证请求用于验证用户输入。在我的场景中,我正在尝试验证来自另一个国家或美国境内的美国移动电话的呼入电话。
我的主要问题是,我位于英国,没有美国电话号码的经验...我已经阅读了如何拨打电话等格式的内容(国际和国内都有),但我担心电话号码在接收者的手机上以不同的格式出现。
以下是我正在尝试做的规范:
- 假设您位于美国,正在接听您的手机电话 - 确定通话是否来自美国或其他国家 - 在英国,呼叫可以以本地或国际格式出现,应该能够确定它是否是美国号码 - 我相信国际电话可以以0044或+44的格式显示在您的手机上(如果您从英国拨打美国) - 如果通话来自美国,它是有效的电话号码吗? - 剥离所有非数字字符并重新格式化为国内格式。例如,英国号码01530 123123将被重新格式化为01530123123 - 剥离所有非数字字符并重新格式化为国际格式。例如,英国号码01530 123123将被重新格式化为00441530123123
我正在尝试使用PHP编写代码并避免使用正则表达式。我认为可以使用substr()来拆分号码的各个部分。
对于如何处理此问题,有任何想法、代码片段或示例电话号码吗?我真的希望来自美国的人能够启发我关于电话号码格式等方面的知识...
7个回答

3
那些只建议查找+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
加拿大的电话号码也有+1。 - Alexandre C.
1
哦,我知道,这就是为什么我说“一些特殊的数字”。完整列表在第二个链接中概述。 - Andrew White

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'));
?>

"us" 现在是我们 这不是收费、免费或特殊号码
根据 wikipedia 的说法, 顺便提一下,由于您有一个英国号码,美国将始终有一个前缀 (否则呼叫本身将不可能)。

1

如果电话号码以+开头,但不是接着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表示免费电话(或保留用于未来扩展免费电话),无法定位到比北美更精确的位置。你唯一确定的是这些号码在北美是免费的。


1
据我所知,如果数字“跨越边界”,它们通常会以国家代码为前缀,因此检查+1或001来识别美国号码应该是相当安全的。
但仅仅因为您接到了一个带有美国号码的电话,并不意味着这个电话来自美国。它可能是一部位于世界任何地方的移动电话。

抱歉,我可能表达得有点不清楚,设备的位置并不重要。如果是一部美国手机在其他国家打电话,被识别为在美国内部打来的美国电话号码也是可以的。无论如何,感谢提供的信息。使用+1或001来识别国际号码是可以的,但对于本地号码有什么想法吗? - RichW
1
如果号码不以国际国家代码开头,则必须是接收者所在国家内部的“本地”呼叫。请注意,反之则不成立。 - user330315
1
实际上,如果号码是澳大利亚人从澳大利亚拨打到其他任何地方,这种方法是行不通的。由于某种奇怪的原因,您必须拨打0011才能拨出 - 因此,美国是00111...,而新西兰是001164...; 基本上,除非他们使用+1语法,否则001将匹配在澳大利亚发起的每个国际呼叫。 - El Yobo

0

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


0

感谢您发表您的答案!请务必仔细阅读关于自我推销的常见问题解答。同时,请注意每次链接到您自己的网站/产品时都需要发布免责声明。 - Andrew Barber

0

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