4

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

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

这是我正在尝试做的规范..

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

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

关于如何解决这个问题、代码片段或示例电话号码的任何想法?我真的希望来自美国的人能够在电话号码格式等方面启发我。

4

7 回答 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(日期待定)
于 2010-12-14T03:43:07.270 回答
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'));
?>

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

顺便说一句,根据维基百科 ,因为您有一个英国号码,我们将始终有一个前缀(否则呼叫本身是不可能的)

于 2010-12-09T10:31:51.190 回答
1

If it begin with + not folllowed by 1 or it begin with 011 it is "international". Other else it is "national".

But, "national" here means North America and not United States of America. The difference might be important in your case. If you really need to know if it is United State and not North America you have to check the regional code. In North America, phones number are composed like that +1 (AAA) NNN-NNNN Where AAA is the area code. This area code can tell You where it is coming from.

You can get a list of area codes here http://en.wikipedia.org/wiki/List_of_North_American_Numbering_Plan_area_codes . Note that when an area code is assigned it will always be at this assignement, but some area codes could be added in future.

EDIT : Area codes 800, 822, 833, 844, 855, 866, 877, 880 through 882, 888 means Toll Free (or reserved for future expansion of Toll Free) and cannot be located more precisly than North America. The only things you are sure about these numbers, they are toll free in North America.

于 2010-12-11T00:01:46.363 回答
1

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

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

于 2010-12-04T18:15:47.753 回答
0

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

于 2010-12-12T16:39:04.103 回答
0

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

于 2013-02-28T19:06:45.710 回答
0

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

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

于 2014-04-10T20:51:40.693 回答