$re = '/\b
\+?1?
(?<separator>\s|-|\.)?
(?: # area code with optional parentheses
(?<area_code>[2-9][0-8]\d)
|\((?&area_code)\)
)
(?&separator)?
(?: # exchange
(?!555)
[2-9]
(?!11)\d\d
)
(?&separator)?
\d{4} # line
\b/mx';
$str = '212 718-1234
(212)718-1234
(212) 718-1234
1(212)718-1234
1-212-718-1234
1.212.718.1234
+1-212-718-1234
+1.212.718.1234
1-212-718-1234
+1 (212) 718-1234
# 1-VALID 2-VALID 4-VALID
231 212 1234
234-235-5678 is a valid telephone number with area code 234, central office prefix (exchange) 235, and line number 5678.
12127181234
(212)7181234
# 1-INVALID 2-INVALID 4-INVALID
091 012 1234
# 1-INVALID 2-VALID 4-INVALID
081 012 1234
171 012 1234
# 1-VALID 2-VALID 4-INVALID
231 012 1234
# 1-INVALID 2-INVALID 4-VALID
091 212 1234
# 1-INVALID 2-VALID 4-VALID
081 212 1234
171 212 1234
231 555 1234
867-5309 missing area code
The number 234-911-5678 is invalid, because the central office code must not be in the form N11. 314-159-2653 is invalid, because the office code must not begin with 1. 123-234-5678 is invalid, because the NPA must not begin with 0 or 1.
1 212) 718 1234
121271812341212718123412127181234';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
// Print the entire match result
var_dump($matches);
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for PHP, please visit: http://php.net/manual/en/ref.pcre.php