$re = '/\+?1?[\ \-\.]?\(?\d+\)?([\ \-\.]?\d+)+(\ ?[xX]\d+)?/m';
$str = '333-555-1075
333.555.1075
(333)555.1075
(333)555-1075
(333)555-1075 x4141
(333) 555-1075
(333) 555-1075 x4141
1 (333) 555-1075
1 (333) 555-1075 x4141
1-333-555-1075
1-333-555-1075 X4141
1.800.591.5911
1.800.591.5911 x41
1.800.591.5911X414166
1.800.591.5911 X4141
+1555789123
+4974339296
+591 74339296
+1 555 555 5554
+1 555 555 5554 x4141
+(591) 7433433
+(591) (4) 6434850 <--fail
0591 74339296
0001 5555555555
(0001) 5555555
59145678464
645-65-7315 <-- also matches social security number
754-3010 Local
(541) 754-3010 Domestic
+1-541-754-3010 International
1-541-754-3010 Dialed in the US
001-541-754-3010 Dialed from Germany
191 541 754 3010 Dialed from France
636-48018 Local (Germany telephone)
(089) / 636-48018 Domestic <-- fails (matches with leading space)
089/636-48018 Domestic <-- fails
+49-89-636-48018 International
19-49-89-636-48018 Dialed from France';
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