preg_match_all("/((\\(|){1}[2-9][0-9]{2}(\\)|){1})?([\\.\\- ]|)[2-9][0-9]{2}([\\.\\- ]|)[0-9]{4}/", $var, $match);
Basically put parenthesis around the section which matches the first part and put a "?" after it.
This does allow it to match numbers with invalid area codes though, since it can just exclude that part and still match. Area codes like (123).