你可能以为这已被问过一百万次,但我认为我的问题有点不同。大多数电话号码验证请求用于验证用户输入。在我的场景中,我正在尝试验证拨打美国移动电话的来电,并确定他们是从其他国家还是从美国境内拨打电话。
我的主要问题是我在英国,并没有美国电话号码的经验..我已经读过如何拨打等格式(国际和国内),但我担心的是手机数字在收件人的手机上以不同的格式显示不同。
以下是我正在尝试做的规范..
我正在尝试用PHP编写代码并避免使用正则表达式。我认为它可以使用substr()来分解数字的一部分。
有关如何解决此问题,代码段或示例电话号码的任何想法?我真的希望来自美国的人能够通过电话号码格式等方式启发我。
答案 0 :(得分:3)
那些只想寻找+1的人并没有多少使用电话号码。 1国家代码适用于北美的许多地区,而不仅仅是美国。那么真正需要发生的是针对North American Numbering Plan和List of North American Numbering Plan area codes
列出的表格的一些逻辑以下是一些“特殊”国家/地区的简短列表,这些国家/地区的数字从+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(待定日期)
答案 1 :(得分: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.因为你有一个英国号码,我们将始终有一个前缀 (否则呼叫本身就不可能)
答案 2 :(得分:1)
据我所知,如果数字“跨越边界”,则数字总是以国家/地区代码为前缀,因此检查+1或001以识别美国数字应该是非常安全的。
但仅仅因为您接到一个美国号码的电话,并不意味着这个电话来自美国。它可能是位于世界任何地方的手机。
答案 3 :(得分: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 表示免费电话(或保留用于未来免费扩展)并且不能比北美更精确地定位。您对这些数字唯一确定的事项是,它们在北美是免费的。
答案 4 :(得分:0)
美国本地区域代码以区号开头,有些区别具有特殊意义,如555或800,总数相同。有些可能被电话用户输入为alpha文本,类似于800CALLNOW,您将无法以该格式接听国际电话。关于您的项目,您需要成为授权和注册的移动网络操作软件工程师,并使用设备的标准代码模块或收集有关呼叫的统计信息,您通常不需要了解您询问的具体信息,因为过滤会在该模块中完成,您需要的是作为参数输出变量。美国要求工作的组织需要为您提供可能遇到的任何特定数字格式的规范,并且可能是国家电信监管机构的文件,假设工作可以在美国境外完成。如果他们没有提供详细信息或者如果被要求不能提供,那么项目的那部分不能令人满意地完成。
答案 5 :(得分:0)
您可以尝试此API,在您提供美国号码时为您提供多种电话号码格式。从这里你可以判断它是否是美国号码。以JSON https://www.mashape.com/parsify/format#endpoint-Phone-Number
返回结果答案 6 :(得分:0)
我们已经开始使用Google的libphonenumber库。它允许您根据多种国际格式格式化您的语音。
这里有一个PHP端口: https://github.com/davideme/libphonenumber-for-PHP