"; } } function sanitize_phone( $phone, $international = false ) { $phone = trim( $phone ); $phone = preg_replace( '/\s+(#|x|ext(ension)?)\.?:?\s*(\d+)/', ' ext \3', $phone ); $us_number = preg_match( '/^(\+\s*)?((0{0,2}1{1,3}[^\d]+)?\(?\s*([2-9][0-9]{2})\s*[^\d]?\s*([2-9][0-9]{2})\s*[^\d]?\s*([\d]{4})){1}(\s*([[:alpha:]#][^\d]*\d.*))?$/', $phone, $matches ); if ( $us_number ) { return 'US: ' . $matches[4] . '-' . $matches[5] . '-' . $matches[6] . ( !empty( $matches[8] ) ? ' ' . $matches[8] : '' ); } if ( ! $international ) { /* SET ERROR: The field must be a valid U.S. phone number (e.g. 888-888-8888) */ return false; } $valid_number = preg_match( '/^(\+\s*)?(?=([.,\s()-]*\d){8})([\d(][\d.,\s()-]*)([[:alpha:]#][^\d]*\d.*)?$/', $phone, $matches ) && preg_match( '/\d{2}/', $phone ); if ( $valid_number ) { return trim( $matches[1] ) . trim( $matches[3] ) . ( !empty( $matches[4] ) ? ' ' . $matches[4] : '' ); } /* SET ERROR: The field must be a valid phone number (e.g. 888-888-8888) */ return false; } function formatPhoneNumber( $s ) { $rx = "/ (1)?\D* # optional country code (\d{3})?\D* # optional area code (\d{3})\D* # first three (\d{4}) # last four (?:\D+|$) # extension delimiter or EOL (\d*) # optional extension /x"; preg_match($rx, $s, $matches); if(!isset($matches[0])) return false; $country = $matches[1]; $area = $matches[2]; $three = $matches[3]; $four = $matches[4]; $ext = $matches[5]; $out = "$three-$four"; if(!empty($area)) $out = "$area-$out"; if(!empty($country)) $out = "+$country-$out"; if(!empty($ext)) $out .= "x$ext"; // check that no digits were truncated // if (preg_replace('/\D/', '', $s) != preg_replace('/\D/', '', $out)) return false; return $out; } function format_phone_number ( $mynum, $mask ) { /*********************************************************************/ /* Purpose: Return either masked phone number or false */ /* Masks: Val=1 or xxx xxx xxxx */ /* Val=2 or xxx xxx.xxxx */ /* Val=3 or xxx.xxx.xxxx */ /* Val=4 or (xxx) xxx xxxx */ /* Val=5 or (xxx) xxx.xxxx */ /* Val=6 or (xxx).xxx.xxxx */ /* Val=7 or (xxx) xxx-xxxx */ /* Val=8 or (xxx)-xxx-xxxx */ /*********************************************************************/ $val_num = validate_phone_number ( $mynum ); if ( !$val_num && !is_string ( $mynum ) ) { echo "Number $mynum is not a valid phone number! \n"; return false; } // end if !$val_num if ( ( $mask == 1 ) || ( $mask == 'xxx xxx xxxx' ) ) { $phone = preg_replace('~.*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4}).*~', '$1 $2 $3'." \n", $mynum); return $phone; } // end if $mask == 1 if ( ( $mask == 2 ) || ( $mask == 'xxx xxx.xxxx' ) ) { $phone = preg_replace('~.*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4}).*~', '$1 $2.$3'." \n", $mynum); return $phone; } // end if $mask == 2 if ( ( $mask == 3 ) || ( $mask == 'xxx.xxx.xxxx' ) ) { $phone = preg_replace('~.*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4}).*~', '$1.$2.$3'." \n", $mynum); return $phone; } // end if $mask == 3 if ( ( $mask == 4 ) || ( $mask == '(xxx) xxx xxxx' ) ) { $phone = preg_replace('~.*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4}).*~', '($1) $2 $3'." \n", $mynum); return $phone; } // end if $mask == 4 if ( ( $mask == 5 ) || ( $mask == '(xxx) xxx.xxxx' ) ) { $phone = preg_replace('~.*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4}).*~', '($1) $2.$3'." \n", $mynum); return $phone; } // end if $mask == 5 if ( ( $mask == 6 ) || ( $mask == '(xxx).xxx.xxxx' ) ) { $phone = preg_replace('~.*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4}).*~', '($1).$2.$3'." \n", $mynum); return $phone; } // end if $mask == 6 if ( ( $mask == 7 ) || ( $mask == '(xxx) xxx-xxxx' ) ) { $phone = preg_replace('~.*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4}).*~', '($1) $2-$3'." \n", $mynum); return $phone; } // end if $mask == 7 if ( ( $mask == 8 ) || ( $mask == '(xxx)-xxx-xxxx' ) ) { $phone = preg_replace('~.*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4}).*~', '($1)-$2-$3'." \n", $mynum); return $phone; } // end if $mask == 8 return false; // Returns false if no conditions meet or input } // end function format_phone_number function validate_phone_number ( $phone ) { /*********************************************************************/ /* Purpose: To determine if the passed string is a valid phone */ /* number following one of the establish formatting */ /* styles for phone numbers. This function also breaks */ /* a valid number into it's respective components of: */ /* 3-digit area code, */ /* 3-digit exchange code, */ /* 4-digit subscriber number */ /* and validates the number against 10 digit US NANPA */ /* guidelines. */ /*********************************************************************/ $format_pattern = '/^(?:(?:\((?=\d{3}\)))?(\d{3})(?:(?<=\(\d{3})\))'. '?[\s.\/-]?)?(\d{3})[\s\.\/-]?(\d{4})\s?(?:(?:(?:'. '(?:e|x|ex|ext)\.?\:?|extension\:?)\s?)(?=\d+)'. '(\d+))?$/'; $nanpa_pattern = '/^(?:1)?(?(?!(37|96))[2-9][0-8][0-9](? false, 'nanpa' => false, 'ext' => false, 'all' => false); //Check data against the format analyzer if ( preg_match ( $format_pattern, $phone, $matchset ) ) { $valid['format'] = true; } //If formatted properly, continue //if($valid['format']) { if ( !$valid['format'] ) { return false; } else { //Set array of new components $components = array ( 'ac' => $matchset[1], //area code 'xc' => $matchset[2], //exchange code 'sn' => $matchset[3] //subscriber number ); // $components = array ( 'ac' => $matchset[1], //area code // 'xc' => $matchset[2], //exchange code // 'sn' => $matchset[3], //subscriber number // 'xn' => $matchset[4] //extension number // ); //Set array of number variants $numbers = array ( 'original' => $matchset[0], 'stripped' => substr(preg_replace('[\D]', '', $matchset[0]), 0, 10) ); //Now let's check the first ten digits against NANPA standards if(preg_match($nanpa_pattern, $numbers['stripped'])) { $valid['nanpa'] = true; } //If the NANPA guidelines have been met, continue if ( $valid['nanpa'] ) { if ( !empty ( $components['xn'] ) ) { if ( preg_match ( '/^[\d]{1,6}$/', $components['xn'] ) ) { $valid['ext'] = true; } // end if if preg_match } else { $valid['ext'] = true; } // end if if !empty } // end if $valid nanpa //If the extension number is valid or non-existent, continue if ( $valid['ext'] ) { $valid['all'] = true; } // end if $valid ext } // end if $valid return $valid['all']; } // end functon validate_phone_number