Is it normal regex for validating NAPN numbers? And no "optimizations" possible?
^\+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}$
您的链接包含比赛信息:
NPA(编号计划区号)- 允许的范围:第一个数字为 [2–9],第二个和第三个数字为 [0-9]。当区号的第二位和第三位相同时,该代码称为易识别代码 (ERC)。ERC 指定特殊服务;例如,888 用于免费服务。NANP 没有分配以 9 作为第二个数字的区号。
NXX(中央办公室)- 允许的范围:第一个数字为 [2–9],第二个和第三个数字为 [0–9](但是,如果第二个数字也是“,则第三个数字不能为“1” 1")。
xxxx(订户号码)-[0–9] 表示四位数字中的每一位。
如果你想省略+1
开头的,那么你可以使用以下来匹配 10 位数字。他们唯一要阻止的是一个包含一些 3 位数本地代码的数字,例如911
、611
、411
等。因此,为了完成这项工作,我们确保在中央办公室部分的第一个数字之后的下 2 个数字number 不是(?!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.