Skip to content
This repository has been archived by the owner on Jan 30, 2020. It is now read-only.

Commit

Permalink
Merge branch 'feature/4127' into develop
Browse files Browse the repository at this point in the history
  • Loading branch information
Show file tree
Hide file tree
Showing 245 changed files with 8,489 additions and 0 deletions.
247 changes: 247 additions & 0 deletions src/Validator/PhoneNumber.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,247 @@
<?php
/**
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2013 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/

namespace Zend\I18n\Validator;

use Zend\Validator\AbstractValidator;

class PhoneNumber extends AbstractValidator
{

const NO_MATCH = 'phoneNumberNoMatch';
const UNSUPPORTED = 'phoneNumberUnsupported';
const INVALID = 'phoneNumberInvalid';

/**
* Validation failure message template definitions
*
* @var array
*/
protected $messageTemplates = array(
self::NO_MATCH => 'The input does not match a phone number format',
self::UNSUPPORTED => 'The country provided is currently unsupported',
self::INVALID => 'Invalid type given. String expected',
);

/**
* Phone Number Patterns
*
* @link http://libphonenumber.googlecode.com/svn/trunk/resources/PhoneNumberMetaData.xml
* @var array
*/
protected static $phone = array();

/**
* ISO 3611 Country Code
*
* @var string
*/
protected $country;

/**
* Allow Possible Matches
*
* @var boolean
*/
protected $allowPossible = false;

/**
* Allowed Types
*
* @var array
*/
protected $allowedTypes = array(
'general',
'fixed',
'tollfree',
'personal',
'mobile',
'voip',
'uan',
);

/**
* Constructor for the PhoneNumber validator
*
* Options
* - country | string | field or value
* - allowed_types | array | array of allowed types
* - allow_possible | boolean | allow possible matches aka non-strict
*
* @param array|Traversable $options
*/
public function __construct($options = array())
{
if ($options instanceof Traversable) {
$options = ArrayUtils::iteratorToArray($options);
}

if (array_key_exists('country', $options)) {
$this->setCountry($options['country']);
}

if (array_key_exists('allowed_types', $options)) {
$this->allowedTypes($options['allowed_types']);
}

if (array_key_exists('allow_possible', $options)) {
$this->allowPossible($options['allow_possible']);
}

parent::__construct($options);
}

/**
* Allowed Types
*
* @param array|null $types
* @return self|array
*/
public function allowedTypes(array $types = null)
{
if (null !== $types) {
$this->allowedTypes = $types;

return $this;
}

return $this->allowedTypes;
}

/**
* Allow Possible
*
* @param boolean|null $possible
* @return self|boolean
*/
public function allowPossible($possible = null)
{
if (null !== $possible) {
$this->allowPossible = (bool) $possible;

return $this;
}

return $this->allowPossible;
}

/**
* Get Country
*
* @return string
*/
public function getCountry()
{
return $this->country;
}

/**
* Set Country
*
* @param string $country
* @return self
*/
public function setCountry($country)
{
$this->country = $country;

return $this;
}

/**
* Load Pattern
*
* @param string $code
* @return array[]|false
*/
protected function loadPattern($code)
{
if (!isset(self::$phone[$code])) {
if (!preg_match('/^[A-Z]{2}$/D', $code)) {
return false;
}

$file = __DIR__ . '/PhoneNumber/' . $code . '.php';
if (!file_exists($file)) {
return false;
}

self::$phone[$code] = include $file;
}

return self::$phone[$code];
}

/**
* Returns true if and only if $value matches phone number format
*
* @param string $value
* @param array $context
* @return bool
*/
public function isValid($value = null, $context = null)
{
if (!is_scalar($value)) {
$this->error(self::INVALID);

return false;
}
$this->setValue($value);

$country = $this->getCountry();

if (!$countryPattern = $this->loadPattern($country)) {
if (isset($context[$country])) {
$country = $context[$country];
}

if (!$countryPattern = $this->loadPattern($country)) {
$this->error(self::UNSUPPORTED);

return false;
}
}

if ($countryPattern['code'] == substr($value, 0, strlen($countryPattern['code']))) {
$valueNoCountry = substr($value, strlen($countryPattern['code']));
}

// check against allowed types strict match:
foreach ($countryPattern['patterns']['national'] as $type => $pattern) {
if (in_array($type, $this->allowedTypes)) {
// check pattern:
if (preg_match($pattern, $value)) {
return true;
} elseif (isset($valueNoCountry) && preg_match($pattern, $valueNoCountry)) {
// this handles conditions where the country code and prefix are the same
return true;
}
}
}

// check for possible match:
if ($this->allowPossible()) {
foreach ($countryPattern['patterns']['possible'] as $type => $pattern) {
if (in_array($type, $this->allowedTypes)) {
// check pattern:
if (preg_match($pattern, $value)) {
return true;
} elseif (isset($valueNoCountry) && preg_match($pattern, $valueNoCountry)) {
// this handles conditions where the country code and prefix are the same
return true;
}
}
}
}

$this->error(self::NO_MATCH);

return false;
}
}
16 changes: 16 additions & 0 deletions src/Validator/PhoneNumber/AC.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?php
return array(
'code' => '247',
'patterns' => array(
'national' => array(
'general' => '/^[2-467]\d{3}$/',
'fixed' => '/^(?:[267]\d|3[0-5]|4[4-69])\d{2}$/',
'emergency' => '/^911$/',
),
'possible' => array(
'general' => '/^\d{4}$/',
'fixed' => '/^\d{4}$/',
'emergency' => '/^\d{3}$/',
),
),
);
22 changes: 22 additions & 0 deletions src/Validator/PhoneNumber/AD.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?php
return array(
'code' => '376',
'patterns' => array(
'national' => array(
'general' => '/^(?:[346-9]|180)\d{5}$/',
'fixed' => '/^[78]\d{5}$/',
'mobile' => '/^[346]\d{5}$/',
'tollfree' => '/^180[02]\d{4}$/',
'premium' => '/^9\d{5}$/',
'emergency' => '/^11[0268]$/',
),
'possible' => array(
'general' => '/^\d{6,8}$/',
'fixed' => '/^\d{6}$/',
'mobile' => '/^\d{6}$/',
'tollfree' => '/^\d{8}$/',
'premium' => '/^\d{6}$/',
'emergency' => '/^\d{3}$/',
),
),
);
26 changes: 26 additions & 0 deletions src/Validator/PhoneNumber/AE.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<?php
return array(
'code' => '971',
'patterns' => array(
'national' => array(
'general' => '/^[2-79]\d{7,8}|800\d{2,9}$/',
'fixed' => '/^[2-4679][2-8]\d{6}$/',
'mobile' => '/^5[0256]\d{7}$/',
'tollfree' => '/^400\d{6}|800\d{2,9}$/',
'premium' => '/^900[02]\d{5}$/',
'shared' => '/^700[05]\d{5}$/',
'uan' => '/^600[25]\d{5}$/',
'emergency' => '/^112|99[789]$/',
),
'possible' => array(
'general' => '/^\d{5,12}$/',
'fixed' => '/^\d{7,8}$/',
'mobile' => '/^\d{9}$/',
'tollfree' => '/^\d{5,12}$/',
'premium' => '/^\d{9}$/',
'shared' => '/^\d{9}$/',
'uan' => '/^\d{9}$/',
'emergency' => '/^\d{3}$/',
),
),
);
17 changes: 17 additions & 0 deletions src/Validator/PhoneNumber/AF.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?php
return array(
'code' => '93',
'patterns' => array(
'national' => array(
'general' => '/^[2-7]\d{8}$/',
'fixed' => '/^(?:[25][0-8]|[34][0-4]|6[0-5])[2-9]\d{6}$/',
'mobile' => '/^7[057-9]\d{7}$/',
'emergency' => '/^1(?:02|19)$/',
),
'possible' => array(
'general' => '/^\d{7,9}$/',
'mobile' => '/^\d{9}$/',
'emergency' => '/^\d{3}$/',
),
),
);
27 changes: 27 additions & 0 deletions src/Validator/PhoneNumber/AG.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php
return array(
'code' => '1',
'patterns' => array(
'national' => array(
'general' => '/^[2589]\d{9}$/',
'fixed' => '/^268(?:4(?:6[0-38]|84)|56[0-2])\d{4}$/',
'mobile' => '/^268(?:464|7(?:2[0-9]|64|7[0-689]|8[02-68]))\d{4}$/',
'pager' => '/^26840[69]\d{4}$/',
'tollfree' => '/^8(?:00|55|66|77|88)[2-9]\d{6}$/',
'premium' => '/^900[2-9]\d{6}$/',
'personal' => '/^5(?:00|33|44)[2-9]\d{6}$/',
'voip' => '/^26848[01]\d{4}$/',
'emergency' => '/^9(?:11|99)$/',
),
'possible' => array(
'general' => '/^\d{7}(?:\d{3})?$/',
'mobile' => '/^\d{10}$/',
'pager' => '/^\d{10}$/',
'tollfree' => '/^\d{10}$/',
'premium' => '/^\d{10}$/',
'personal' => '/^\d{10}$/',
'voip' => '/^\d{10}$/',
'emergency' => '/^\d{3}$/',
),
),
);
23 changes: 23 additions & 0 deletions src/Validator/PhoneNumber/AI.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?php
return array(
'code' => '1',
'patterns' => array(
'national' => array(
'general' => '/^[2589]\d{9}$/',
'fixed' => '/^2644(?:6[12]|9[78])\d{4}$/',
'mobile' => '/^264(?:235|476|5(?:3[6-9]|8[1-4])|7(?:29|72))\d{4}$/',
'tollfree' => '/^8(?:00|55|66|77|88)[2-9]\d{6}$/',
'premium' => '/^900[2-9]\d{6}$/',
'personal' => '/^5(?:00|33|44)[2-9]\d{6}$/',
'emergency' => '/^911$/',
),
'possible' => array(
'general' => '/^\d{7}(?:\d{3})?$/',
'mobile' => '/^\d{10}$/',
'tollfree' => '/^\d{10}$/',
'premium' => '/^\d{10}$/',
'personal' => '/^\d{10}$/',
'emergency' => '/^\d{3}$/',
),
),
);
Loading

0 comments on commit 2d12221

Please sign in to comment.