我无法找到能够检测到以下内容的模式
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
我尝试过但它并不适用于所有实例。我想我可以通过将每个字符放入一个数组然后检查它来分解问题。但那时代码太长了。
答案 0 :(得分:1)
最后一组中有4位数字,并且在正则表达式中指定3位数。
您还需要将?
量词(1或0次出现)应用于分隔符,因为它们是可选的。
使用
^[(]?[0-9]{3}[)]?[ ,-]?[0-9]{3}[ ,-]?[0-9]{4}$
$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);
$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
希望它有所帮助。