$re = '/^
(?:
(?:\+|00|011)[\.\/\-\ \t]*
(?# group 1: country code after international dialing code)
([17]|2(?:[07]|[1-689]\d)|3(?:[0-4679]|[578]\d)|4(?:[013-9]|2\d)|5(?:[1-8]|[09]\d)|6(?:[0-6]|[789]\d)|8(?:[1246]|[035789]\d)|9(?:[0-58]|[679]\d))
[\.\/\-\ \t]*
| (?# group 2: single-digit country code without international dialing code)
([17])
[\.\/\-\ \t]+(?# a separator is required for disambiguation)
)?
(?# group 3: area code between parentheses, optional)
(?:\((\d{1,4})\)[\.\/\-\ \t]*)?
(?# groups 4-7: leading groups of digits, may be empty)
(?:(\d{1,6})[\.\/\-\ ])?
(?:(\d{1,6})[\.\/\-\ ])?
(?:(\d{1,6})[\.\/\-\ ])?
(?:(\d{1,6})[\.\/\-\ ])?
(?# group 8: start of the last group of digits, may be empty)
(\d{0,10}?)
(?# group 9: up to 4 digits at end of the last group of digits)
(\d{1,4}+)
(?:
[\.\/\-;\ \t]*e?xt?[\.\/\-=\ \t]*+
(?# group 10: extension code, optional)
(\d{1,14})
)?
$/mxi';
$str = 'All valid numbers should have a non-empty group 9 for the last digits (before extension):
+1(234)567 8901
+1 234 567 8901
+1-234-567-8901
+1-234-567-8901
+1.234.567.8901
+1/234/567/8901
+7-123-456-7890
+7(123)4567890
+27-31-707-1700
+27-84-820-0365
+261-23-456-7890
+212 (34) 567-8901
+34123456789
+34 1 23 45 67 89
+34 123 456 789
+39 0577286143
+44(012)123456789
+49 (1234) 567890
+49 211 828934-0
+49 69 96876-150
1-234-555-8901
7-123-456-7890
0012315557890
001 230 123 456789
001-555012345
00210123456789
00271-12-345-6789
003312345678
009112345678
008001234567890
With an extension:
+12345678901x1234
+1-234-567-8901 x1234
+7 123-4567890-x321
+7 123 4 5 6-7890x1234
+7-123-456-7890 ext 1234
+33(1)23.45.67.89 x 1234
+9123-456-7890x12345
+9123-456-7890;ext=12345
+91-92130-25552
01172312345678x901
011 7 231 234 5678 ext. 901
011 7 231 234 5678;ext=901
0091234567890x1234
0011234567890ext.1234
00223-(4321)-567.89 ext-4321
007-(123)-456-7890 ext 4321
007-(123)-456-7890;ext=4321
Local numbers only (or missing/unknown country code):
(800)5678901
(800) 567 8901
(234) 567 8901
(234) 567 89 01
(1)23 45 67 89
(01)23 45 67 89
(0)1 23 45 67 89
(0)1 23 45 6789
(0)800 800 800
(0)800 800 800;ext=12
800-567-8901
234-567-8901
234 567 8901
01 23 45 67 89
01 23 45 6789
0 800 800 800
00-0-0000
123456789
123456789012
12345678901
2345678901
12345678
1234567890123
Local short numbers (up to 4 digits):
12 34
1234
112
911
15
Ambiguous or invalid format:
00-0--0000
(01 55) 1234 5678
(01 551) 234 5678
+012345678
+340123456789
++34123456789
(0)123456789
12(34567890
123)456789012345
)234( 567 8901
ext1234
';
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