我目前正在建立一个网站,在PHP,用户将能够通过短信互动。因此,我需要将他们的电话号码存储在我的数据库中。由于我现在只允许在美国的短信互动,我需要检查提交的电话号码是否符合美国格式。一般来说,这意味着一些事情:1必须是第一个数字,区号不能以0或1开头,没有前导1的字符串必须是10位(3位区号加7位数字)。
尽管有所有这些要求,我希望用户可以自由地以他们喜欢的任何格式输入他们的号码,而不会造成错误。
发布于 2014-09-26 21:16:34
忽略非数字是第一步.并不是所有的电话公司,特别是新泽西附近的电话公司都需要领先的1。在那里拨它会导致错误或错误的号码。
区号不能是2-911或2-990-9.以9为中心数字的区号保留给尚未确定的解决区号耗尽问题的方案。
交易所也不能以0或1开头,也不能是2-911.
这些限制用以下代码表示:
$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发布于 2014-09-26 20:50:43
在我从搜索和搜索中学到了什么之后,我找不到一个美国唯一的方法。所以,这是我设计的:
首先,要允许任何输入格式,请使用preg_replace删除所有非数字字符.用户可以使用他们想要的任何连字符或斜线,但他们对我没有用。
$mobile = preg_replace('/\D/', '', $trimmed['mobile']);只要使用一个纯粹的数字字符串,就可以消除任何领先的1--这可以处理用户包含前导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缩小到美国的唯一方法是通过分析当前美国地区代码列表来验证美国区号是否被使用。
https://stackoverflow.com/questions/26068100
复制相似问题