我目前正在用PHP构建一个网站,用户可以通过短信进行交互。因此,我需要将他们的电话号码存储在我的数据库中。由于我现在只在美国允许短信互动,因此我需要检查提交的电话号码是否符合美国格式。通常,这意味着一些事情:1
必须是第一个数字,区号不能以0
或1
开头,而不包含前导1
的字符串必须为10位数(3位区号和7位数字)。
尽管有这些要求,我希望用户可以随意以他们喜欢的任何格式输入他们的号码,而不会导致错误。
答案 0 :(得分:2)
忽略非数字是第一步。所有电话公司都不需要领先1,特别是在新泽西附近。在那里拨号会导致错误或错误的号码。
区号不能是[2-9] 11也不能是[2-9] 9 [0-9]。以9为中心数字的区号保留用于尚未确定的方案,以解决区域代码耗尽问题。
交换也不能以0或1开头,也不能是[2-9] 11。
这些限制用以下代码表示:
$mobile = preg_replace ('/\D/', '', $trimmed['mobile']);
if ($mobile[0] == '1') $mobile = substr ($mobile, 1); // remove prefix
$invalid = strlen ($mobile) != 10 ||
preg_match ('/^1/', $mobile) || // ac start with 1
preg_match ('/^.11/', $mobile) || // telco services
preg_match ('/^...1/', $mobile) || // exchange start with 1
preg_match ('/^....11/', $mobile) || // exchange services
preg_match ('/^.9/', $mobile); // ac center digit 9
答案 1 :(得分:0)
在从搜索和搜索中学到了什么之后,我找不到美国唯一的方法。所以,这就是我设计的:
首先,要允许任何输入格式,请使用preg_replace
删除所有非数字字符。 [用户可以使用他们想要的任何连字符或斜线,但它们对我没用。]
$mobile = preg_replace('/\D/', '', $trimmed['mobile']);
只需使用一串纯数字,即可消除任何前导1
- 这将处理用户包含前导1或用1
启动区号的任何实例。 [如果有效,这应该总是留下10
数字字符串。]
$mobiletrim = ltrim($mobile, '1');
接下来,正则表达式会检查修剪后的电话号码是否长度为10
位,并且不会以0
或1
开头。
if (preg_match ('/^[2-9]\d{9}$/', $mobiletrim) || empty($trimmed['mobile'])) {
$mp = TRUE;
if (!empty($trimmed['mobile'])) { $mobiletrim = "1" . $mobiletrim; }
} else {
$profile_errors[] = "Please enter a valid U.S. phone number.";
}
if ($mp) { //Store Phone Number in db }
您可以在上面看到的最后一步是在将有效数字存储在数据库中之前添加前导1
,前提是用户没有提交空的电话字段,如果他们这样做,他们会这样做不想存储他们的号码。
从技术上讲,这将验证所有NANP号码。将它从NANP缩小到美国的唯一方法是通过解析当前美国地区代码列表来验证是否使用了美国地区代码。