北美电话号码的正则表达式验证

时间:2015-10-15 21:23:26

标签: php regex

我无法找到能够检测到以下内容的模式

909-999-9999

909 999 9999

(909)999-9999

(909)999 9999

999 999 9999

9999999999

\A[(]?[0-9]{3}[)]?[ ,-][0-9]{3}[ ,-][0-9]{3}\z

我尝试过但它并不适用于所有实例。我想我可以通过将每个字符放入一个数组然后检查它来分解问题。但那时代码太长了。

2 个答案:

答案 0 :(得分:1)

最后一组中有4位数字,并且在正则表达式中指定3位数。

您还需要将?量词(1或0次出现)应用于分隔符,因为它们是可选的。

使用

^[(]?[0-9]{3}[)]?[ ,-]?[0-9]{3}[ ,-]?[0-9]{4}$

请参阅the demo here

PHP demo

$re = "/\A[(]?[0-9]{3}[)]?[ ,-]?[0-9]{3}[ ,-]?[0-9]{4}\z/"; 
$strs = array("909-999-9999", "909 999 9999", "(909) 999-9999", "(909) 999 9999", "999 999 9999","9999999999"); 
$vals = preg_grep($re, $strs);
print_r($vals);

another one

$re = "/\A[(]?[0-9]{3}[)]?[ ,-]?[0-9]{3}[ ,-]?[0-9]{4}\z/"; 
$str = "909-999-9999";
if (preg_match($re, $str, $m)) {
    echo "MATCHED!";
}

顺便说一句,可选的?子模式比交替更好。

答案 1 :(得分:0)

试试这个正则表达式:

^(?:\(\d{3}\)|\d{3})[- ]?\d{3}[- ]?\d{4}$

解释

^                 # from start
(?:               # one of
    \(\d{3}\)     # '(999)' sequence
        |         # OR
    \d{3}         # '999' sequence
)                 #
[- ]?             # may exist space or hyphen
\d{3}             # three digits
[- ]?             # may exist space or hyphen
\d{4}             # four digits
$                 # end of string

希望它有所帮助。