has to be improved //need to count how many numbers have been filled, ... else { return true; } } function valid_uk_phone_number($phonenumber) { /* Accepts: +441970123456 +44(0)1970123456 +44 1970 123 456 +44 (0)1970 123 456 (01970) 123456 #0001 Rejects: (+441970)123456 +44(1970)123456 +44 01970 123 456 (0197) 0123456 #01 */ $regex = "/ ( (^\+44\s?(\(0\))?\d{4}|^\(?0\d{4}\)?){1}\s?\d{3}\s?\d{3} # 4 digit area code with optional +44 internationalisation or not, optional spaces and brackets. | (^\+44\s?(\(0\))?\d{3}|^\(?0\d{3}\)?){1}\s?\d{3}\s?\d{4} # 3 digit area code with optional +44 internationalisation or not, optional spaces and brackets. | (^\+44\s?(\(0\))?\d{2}|^\(?0\d{2}\)?){1}\s?\d{4}\s?\d{4} # 2 digit area code with optional +44 internationalisation or not, optional spaces and brackets. ) (\s?\#\d*)? # optional extension number shown with a hash divider /x"; if (!preg_match($regex, $phonenumber)) { return false; } else { return true; } } /** * Convert a valid United Kingdom phone number into standard +44 (0)1970 123 456 #001 international format * * @param $phonenumber must be a valid eleven-digit number (with optional extension) * */ function format_uk_phone_number($phonenumber) { $area = $number = $extension = ''; //If we already have the formatting we want just return if (preg_match( "/ ( \+44\s\(0\)\d{4}\s\d{3}\s\d{3} # 4 digit area code | \+44\s\(0\)\d{3}\s\d{3}\s\d{4} # 3 digit area code | \+44\s\(0\)\d{2}\s\d{4}\s\d{4} # 2 digit area code ) (\s\#\d*)? /",$phonenumber)) { return $phonenumber; } else { //Simplify to 10 digit number and clean up ready for international reformat. $phonenumber = preg_replace("/^(\+44)?\s?(\(?0\)?)?/","",$phonenumber); $phonenumber = preg_replace("/\(/","",$phonenumber); $phonenumber = preg_replace("/\(0/","",$phonenumber); $phonenumber = preg_replace("/\)/","",$phonenumber); //If there are some spaces in the number assume some level of preformatting if(preg_match("/ /",$phonenumber)) { $regex = "/ # 4 digit area code. ( (\d{4}) # capture 4 digit area code \s+ # ignore required separator to make a distinction with other area codes (\d{3}) # capture first set of numbers in the local number \s* # ignore optional separator (\d{3}) # capture second set of numbers in the local number | # 3 digit area code. (\d{3}) # capture 3 digit area code \s+ # ignore required seperator (\d{3}) # capture first set of numbers in the local number \s* # ignore possible boundary (\d{4}) # capture second set of numbers in the local number | # 2 digit area code. (\d{2}) # capture 2 digit area code \s+ # ignore required boundary to make a distinction with other area codes (\d{4}) # capture first set of numbers in the local number \s* # ignore possible boundary (\d{4}) # capture second set of numbers in the local number ) # capture the optional extension number (\s*\#)? (\d{4}|\d{3})? /x"; preg_match($regex, $phonenumber, $matches); var_export($matches); $area = $matches[2].$matches[5].$matches[8]; $number = $matches[3].$matches[6].$matches[9].' '.$matches[4].$matches[7].$matches[10]; $extension = $matches[12]; } //If there are no spaces in the number assume 4 digit area code. else { preg_match("/(\d{4})(\d{3})(\d{3})\#?(\d*)?/",$phonenumber, $matches); $area = $matches[1]; $number = $matches[2].' '.$matches[3]; $extension = $matches[4]; } $phonenumber = '+44 (0)'.$area.' '.$number; $phonenumber .= (empty($extension))?'':" #$extension"; } return $phonenumber; }