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

Php 确定美国的本地/国际电话号码,php,phone-number,Php,Phone Number,你可能认为这个问题以前被问过一百万次,但我认为我的问题有点不同。大多数电话号码验证请求用于验证用户输入。在我的场景中,我试图验证美国手机的来电,并确定他们是从另一个国家还是从美国国内打来的 我的主要问题是我在英国,没有美国电话号码的经验。。我读过关于如何拨号等格式(国际和国内)的书,但我担心的是,收件人的电话号码在不同的格式上显示不同 这是我要做的事情的说明 想象一下,您的总部位于美国,正在通过手机接听电话 确定呼叫是来自美国还是其他国家 在英国,电话可以以本地或国际格式显示,它应该能够确定它

你可能认为这个问题以前被问过一百万次,但我认为我的问题有点不同。大多数电话号码验证请求用于验证用户输入。在我的场景中,我试图验证美国手机的来电,并确定他们是从另一个国家还是从美国国内打来的

我的主要问题是我在英国,没有美国电话号码的经验。。我读过关于如何拨号等格式(国际和国内)的书,但我担心的是,收件人的电话号码在不同的格式上显示不同

这是我要做的事情的说明

  • 想象一下,您的总部位于美国,正在通过手机接听电话
  • 确定呼叫是来自美国还是其他国家
  • 在英国,电话可以以本地或国际格式显示,它应该能够确定它是否是美国号码
  • 我相信国际长途电话可以以0044或+44格式显示在您的手机上(如果您是从英国呼叫美国)
  • 如果该电话来自美国境内,该电话号码是否有效
  • 去掉所有非数字字符并重新格式化为国家格式。例如,英国号码01530 123123将被重新格式化为01530123123
  • 去掉所有非数字字符并重新格式化为国际格式。例如,英国号码01530 123123将被重新格式化为00441530123123
我试图用PHP编写代码,避免使用正则表达式。我想它可以使用substr()来分解部分数字


关于如何处理这个问题,代码片段或示例电话号码有什么想法吗?我真的希望来自美国的人能在电话号码格式等方面给我一些启发。

据我所知,如果电话号码“跨境”的话,它们总是以国家代码作为前缀,所以检查+1或001来识别美国号码应该是相当安全的

但仅仅因为你收到一个美国号码的电话,并不意味着这个电话来自美国。它可能是一部位于世界任何地方的移动电话。

这样就可以了

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

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

依照 b、 t.w.因为你有一个英国号码,所以美国总是有一个前缀 (否则调用本身不可能)

如果以+开头,后面不跟1或以011开头,则为“国际”。其他则是“全国性的”

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

你可以在这里得到区号列表。请注意,当分配区号时,它将始终位于此分配位置,但将来可能会添加一些区号


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

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

说只寻找+1的人没有多少电话号码。1国家代码适用于北美的许多地区,而不仅仅是美国。因此,真正需要做的是围绕和列出的表格的一些逻辑

以下是一些“例外”国家的简短列表,这些国家的数字以+1开头,但不以美国为基础

百慕大:

  • 1995年后:+1441(xxx)xxxx
波多黎各:

  • 2001年后:+1787 xxx xxxx或+1939 xxx xxxx(覆盖整个岛屿)
美属维尔京群岛:

  • 1997年后:+1340 xxx xxxx
北马里亚纳:

  • 1997年后:+1670 xxx xxxx
关岛:

  • 1997年后:+1671 xxx xxxx
美属萨摩亚:

  • 2004年10月2日之后:+1684 xxx xxxx
圣马丁:

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

您可以尝试使用此API,当您提供美国号码时,它会为您提供多种电话号码格式。从这里你可以知道这是不是一个美国号码。返回JSON格式的结果

我们已经开始使用谷歌的libphonenumber库。它允许你