You are here

phone.nz.inc in Phone 6

CCK Field for New Zealand phone numbers.

File

phone.nz.inc
View source
<?php

/**
 * @file
 * CCK Field for New Zealand phone numbers.
 */
function phone_nz_metadata() {

  // These strings are translated using t() on output.
  return array(
    'label' => 'Phone Numbers - New Zealand ',
    '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 . ' ';
  }
}

Functions

Namesort descending Description
format_nz_phone_number Formatting for New Zealand Phone Numbers.
phone_nz_metadata @file CCK Field for New Zealand phone numbers.
valid_nz_phone_number Verification for New Zealand Phone Numbers. As supplied by http://www.itu.int/itudoc/itu-t/number/n/nzl/76195_ww9.doc, April 2009
_format_nz_phone_number_prefix Formats the prefix as either +64 4 or (04), depending on the original prefix context