北美编号计划正则表达式

时间:2013-08-22 16:15:14

标签: php regex

验证NAPN号码是正常的正则表达式吗? 没有“优化”可能吗?

^\+1[2-9](0(?!0)|1(?!1)|2(?!2)|3(?!3)|4(?!4)|5(?!5)|6(?!6)|7(?!7)|8(?!8)|9(?!9))[0-9][2-9]((0|[2-9]){2}|1(?!1)[0-9]|(0|[2-9])1)[0-9]{4}$

1 个答案:

答案 0 :(得分:5)

您的链接包含匹配信息:

  

NPA (编号方案区号) - 允许范围:第一个数字为[2-9],第二个和第三个数字为[0-9]。当。。。的时候   区号的第二和第三位是相同的,代码是   称为容易识别的代码(ERC)。 ERC指定特殊   服务;例如,888用于免费服务。 NANP没有分配   区号用9作为第二位数。

     

NXX (中央办公室) - 允许的范围:第一个数字为[2-9],第二个和第三个数字为[0-9](但是,第三个数字)   如果第二个数字也是“1”,则数字不能为“1”。

     

xxxx (订阅者编号) - 四位数中的每一位都是[0-9]。

如果您想在开头省略+1,则可以使用以下内容来匹配10位数字。他们唯一阻止的是包含一些3位数字本地代码的数字,例如911611411等。为了完成这项工作,我们确保在该号码的中心局部分中的第一个后面的下两个数字不是具有负前瞻的(?!11)个。

此模式适用于大多数字符串。

$pattern = '~^\(?([2-9][0-9]{2})\)?[-. ]?([2-9](?!11)[0-9]{2})[-. ]?([0-9]{4})$~';

$numbers = array(
'(800) 555 1212',
'(800) 911 1212',
'(800) 910 1212',
'(800) 901 1212',
'(100) 455 1212',
'(800) 155 1212',
'555 555 1212',
'813.555.1212',
);



foreach($numbers as $number){
    if(preg_match($pattern,$number)){
      echo "$number is valid.\n";   
    } else {
      echo "$number is invalid. \n";    
    }
}

<强>输出

(800) 555 1212 is valid.
(800) 911 1212 is invalid. 
(800) 910 1212 is valid.
(800) 901 1212 is valid.
(100) 455 1212 is invalid. 
(800) 155 1212 is invalid. 
555 555 1212 is valid.
813.555.1212 is valid.