| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224 | <?php/** * @file * CCK Field for New Zealand phone numbers. */function phone_nz_metadata() {  // These strings are translated using t() on output.  return array(    'error' => '"%value" is not a valid New Zealand phone number!<br>New Zealand phone numbers should contain only numbers, spaces, brackets and "-". They should look like 04 123 4567 or can optionally omit the leading 0 and have a prefix of "+64".',  );}/** * Verification for New Zealand Phone Numbers. * As supplied by http://www.itu.int/itudoc/itu-t/number/n/nzl/76195_ww9.doc, April 2009 * * @param string $phonenumber * @return boolean returns boolean FALSE if the phone number is not valid. */function valid_nz_phone_number($phonenumber) {  //$phonenumber = trim($phonenumber);  // strip formatting chars  $phonenumber = preg_replace('/[\-() ]/', '', $phonenumber);  // strip optional '+64' or '0' prefixes  $phonenumber = preg_replace('/^(\+64|0)/', '', $phonenumber);  //$rules[] = array("Prefix","Minimum length","Maximum length");  // special purpose service codes and numbers  /*// Enable if required  $rules[] = array('10', 3, 3);  $rules[] = array('12', 6, 7); // NZ Direct Service  $rules[] = array('60', 4, 4); // Directory Assistance (operator only) - Maybe shouldn't be in here  $rules[] = array('83', 5, 8); // "Enhanced Voice Services"  $rules[] = array('86', 8, 8); // "Enhanced Paging Services"  $rules[] = array('87', 4, 8); // "PSTN access to data services"  */  // Mobile  $rules[] = array('20', 9, 9); // mobile radio / Orcon mobile  $rules[] = array('22', 8, 10); // NZ Communications (actual lengths subject to change)  $rules[] = array('210', 8, 10); // Vodafone  $rules[] = array('211', 8, 9);  // Vodafone  $rules[] = array('212', 8, 9);  // Vodafone  $rules[] = array('213', 8, 9);  // Vodafone  $rules[] = array('214', 8, 9);  // Vodafone  $rules[] = array('215', 8, 9);  // Vodafone  $rules[] = array('216', 8, 9);  // Vodafone  $rules[] = array('217', 8, 9);  // Vodafone  $rules[] = array('218', 8, 9);  // Vodafone  $rules[] = array('219', 8, 9);  // Vodafone  $rules[] = array('24', 8, 8); // Scott Base  //$rules[] = array('25', 8, 9); // Old Telecom 025, now unused  $rules[] = array('26', 8, 9); // Telecom Paging  $rules[] = array('27', 9, 9); // Telecom 027 mobile  $rules[] = array('29', 8, 9); // TelstraClear mobile  // South Island regional  $rules[] = array('32', 8, 8);  $rules[] = array('33', 8, 8);  $rules[] = array('34', 8, 8);  $rules[] = array('35', 8, 8);  $rules[] = array('36', 8, 8);  $rules[] = array('37', 8, 8);  $rules[] = array('39', 8, 8);  // Wellington regional  $rules[] = array('42', 8, 8);  $rules[] = array('43', 8, 8);  $rules[] = array('44', 8, 8);  $rules[] = array('45', 8, 8);  $rules[] = array('46', 8, 8);  $rules[] = array('48', 8, 8);  $rules[] = array('49', 8, 8);  // Manawatu, Taranaki, Hawkes Bay, Gisborne, Wairarapa, Otaki regional  $rules[] = array('62', 8, 8);  $rules[] = array('63', 8, 8);  $rules[] = array('67', 8, 8);  $rules[] = array('68', 8, 8);  $rules[] = array('69', 8, 8);  // Waikato, BOP, Taumarunui regional  $rules[] = array('73', 8, 8);  $rules[] = array('75', 8, 8);  $rules[] = array('62', 8, 8);  $rules[] = array('78', 8, 8);  $rules[] = array('79', 8, 8);  // Freecall  $rules[] = array('80', 8, 10);  // Pay-call  $rules[] = array('90', 8, 10);  // Auckland + Northland regional  $rules[] = array('92', 8, 8);  $rules[] = array('93', 8, 8);  $rules[] = array('94', 8, 8);  $rules[] = array('95', 8, 8);  $rules[] = array('96', 8, 8);  $rules[] = array('98', 8, 8);  $rules[] = array('99', 8, 8);  foreach ($rules as $rule) {    if (preg_match('/^'.$rule[0].'/', $phonenumber) && strlen($phonenumber) >= $rule[1] && strlen($phonenumber) <= $rule[2]) {      return true;    }  }  return false;}/** * Formatting for New Zealand Phone Numbers. * * @param string $phonenumber * @return string Returns a string containing the phone number with some formatting. */function format_nz_phone_number($phonenumber, $field) {  $prefix = '';  $extension = '';  // strip old formatting chars  $phonenumber = preg_replace('/[\-() ]/', '', $phonenumber);  /*   * strip and save the +64 prefix if found   */  if (preg_match('/^\+64/', $phonenumber, $match)) {    $prefix = '+64';    $phonenumber = str_replace('+64', '', $phonenumber);  }  else {    $prefix = '0';    /*     * Remove a leading 0, if present     */    if (preg_match('/^0/', $phonenumber, $match)) {      $phonenumber = substr($phonenumber, 1);    }  }  /*   * strip and save the extension (x9999) postfix if found   */  if (preg_match('/(x[0-9]+)$/', $phonenumber, $match)) {    $extension = ' '.$match[1];    $phonenumber = preg_replace('/x[0-9]+$/', '', $phonenumber);  }  /*   * geographic numbers   * Eg. (04) 123 4578   */  if (preg_match('/^([34679])([0-9]{3})([0-9]{4})$/', $phonenumber, $match)) {    return _format_nz_phone_number_prefix($prefix, $match[1]) . $match[2] . ' ' . $match[3] . $extension;  }  /*   * 8 digit mobile numbers   * Eg. 021 123 123   */  if (preg_match('/^(2[12679])([0-9]{3})([0-9]{3})$/', $phonenumber, $match)) {    return _format_nz_phone_number_prefix($prefix, $match[1]) . $match[2] . ' ' . $match[3] . $extension;  }  /*   * 9 digit mobile numbers   * Eg. 021 123 4567   */  if (preg_match('/^(2[12679])([0-9]{3})([0-9]{4})$/', $phonenumber, $match)) {    return _format_nz_phone_number_prefix($prefix, $match[1]) . $match[2] . ' ' . $match[3] . $extension;  }  /*   * 10 digit mobile numbers   * Eg. 021 1234 1234   */  if (preg_match('/^(2[12679])([0-9]{4})([0-9]{4})$/', $phonenumber, $match)) {    return _format_nz_phone_number_prefix($prefix, $match[1]) . $match[2] . ' ' . $match[3] . $extension;  }  /**   * 0800/0900 numbers (a bit random)  */  if (preg_match('/^(900|800)(\d+)$/', $phonenumber, $match)) {    // How we format depends on the length    $formatted = null;    switch(strlen($match[2])) {      case 5: $formatted = preg_replace('/^(\d{2})(\d{3})$/', '$1$2', $match[2]); break;      case 6: $formatted = preg_replace('/^(\d{3})(\d{3})$/', '$1$2', $match[2]); break;      case 7: $formatted = preg_replace('/^(\d{3})(\d{4})$/', '$1 $2', $match[2]); break;    }    return _format_nz_phone_number_prefix($prefix, $match[1]).$formatted;  }  // default (probably bad)  return $prefix . $phonenumber . $extension;}/** * Formats the prefix as either +64 4 or (04), depending on the original prefix context * * @param string $prefix either '+64' or '0' * @param string  $area_code the area code, eg. 4, 21, 27 etc * @return string the formatted prefix */function _format_nz_phone_number_prefix($prefix, $area_code) {  $area_code = intval($area_code);  if (in_array($area_code, array('800', '900'))) {    return ($prefix == '0') ? $prefix.$area_code.' ' : $prefix.' '.$area_code.' ';  }  else {    return ($prefix == '0') ? '('.$prefix.$area_code.') ' : $prefix.' '.$area_code.' ';  }}
 |