123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- <?php
- /**
- * @file
- * CCK Field for British phone numbers.
- */
- function phone_gb_metadata() {
- // These strings are translated using t() on output.
- return array(
- 'error' => '"%value" is not a valid British (UK) phone number<br>British Phone numbers should .... ',
- );
- }
- /**
- * Verifies that $phonenumber is a valid eleven-digit United Kingdom phone number
- *
- * Regular expression adapted from Amos Hurd's regex at RegExLib.com
- *
- * @param string $phonenumber
- * @return boolean Returns boolean FALSE if the phone number is not valid.
- */
- function valid_gb_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.
- |
- (^\+44\s?(\(0\))?\d{1}|^\(?0\d{1}\)?){1}\s?\d{5}\s?\d{5} # 1 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_gb_phone_number($phonenumber, $field = FALSE) {
- $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);
- $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];
- }
-
- if ($field['phone_country_code']) {
- $phonenumber = '+44 (0)'.$area.' '.$number;
- }
- else {
- $phonenumber = '0'.$area.' '.$number;
- }
- $phonenumber .= (empty($extension))?'':" #$extension";
- }
- return $phonenumber;
- }
|