$re = '/[\([]?([0-9]{3})[\)\]]?[-. ]?[\([]?([0-9]{3})[\)\]]?[-. ]?[\([]?([0-9]{4})[\)\]]?|([0-9])[-. ]([0-9])[-. ]([0-9])[-. ]([0-9])[-. ]([0-9])[-. ]([0-9])[-. ]([0-9])[-. ]([0-9])[-. ]([0-9])[-. ]([0-9])/';
$str = 'Yes I understand that, but in reality, when I try to run \'987 654 3210\' or \'987-654-3210\' or \'987.654.3210\', it does not work.
987 654 3210
9 8 7 6 5 4 3 2 1 0
(987) 654 3210
(987) (654) (3210)
987.654-3210
9 8 7.6-5-4.3 2 1 0
[987] 654 3210
(987)-(654).(3210)';
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