我目前正在用PHP构建一个网站,用户可以通过短信进行交互。因此,我需要将他们的电话号码存储在我的数据库中。由于我现在只允许在美国进行短信交互,我需要检查提交的电话号码是否符合美国格式。一般来说,这意味着几件事:1
必须是第一个数字,区号不能以0
或1
开头,没有前导1
的字符串必须是10位数字(3位区号加7位数字)。
尽管有所有这些要求,我希望用户可以自由地以他们喜欢的任何格式输入他们的号码,而不会导致错误。
忽略非数字是第一步。领先的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
在学习了搜索和搜索后,我找不到只在美国使用的方法。所以,以下是我设计的:
首先,为了允许任何输入格式,请使用preg_replace
删除所有非数字字符。[用户可以使用他们想要的任何连字符或斜杠,但对我来说没有用。]
$mobile = preg_replace('/'D/', '', $trimmed['mobile']);
只需使用一个纯数字字符串,就可以消除任何前导1
s——这可以处理用户包含前导1或他们用1
开始区号的任何实例。[如果有效,这应该总是给我留下一个10
数字字符串。]
$mobiletrim = ltrim($mobile, '1');
接下来,regex检查修剪后的电话号码是否正好是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缩小到U.S.的唯一方法是通过解析当前美国区号列表来验证是否使用了美国区号。