This repository has been archived by the owner on Jan 30, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 49
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'feature/4127' into develop
- Loading branch information
128 parents
933b99e
+
84844ae
+
62fc651
+
b0a3dd4
+
0dca0ef
+
910bbbf
+
e574b9b
+
f30ec7d
+
1fa84de
+
41b8543
+
9e2c9d5
+
913f51c
+
39924f3
+
c2a11e1
+
61b9322
+
413a38b
+
e51b2b8
+
20e328b
+
6437ec0
+
e9b8476
+
95e54a0
+
7ea3aed
+
df6a706
+
a82fc82
+
7c2a059
+
4fefb53
+
599ee3a
+
ea3fc65
+
f6c04c2
+
6591e3d
+
a4f76e3
+
33c7531
+
2d59782
+
8152327
+
e56ce9b
+
db9b18f
+
b88635a
+
a262823
+
b79aef6
+
c2284e4
+
70193eb
+
96acf77
+
9675426
+
5f02411
+
0dafea7
+
15dc674
+
4a2447d
+
e6eb7f3
+
e9499c5
+
272b15f
+
11c7758
+
6f0e918
+
5f4980a
+
ecca95a
+
88b5971
+
ecb8d13
+
9de1c08
+
44aad17
+
13269e9
+
654cdb6
+
dc708db
+
380ffba
+
ff67e7f
+
fe2e025
+
95f0efa
+
68cc4b3
+
bf13b96
+
8870381
+
56480f4
+
1fa90d7
+
5c7fe1f
+
abe9bc1
+
a33cacd
+
cdd7d9f
+
6a261b1
+
5e594c4
+
01c1241
+
30d1dd2
+
d4af079
+
c9aa9b4
+
10f47ca
+
ef20fa1
+
2187ae2
+
e7f3993
+
db93d37
+
aa57612
+
4af81d8
+
2f90998
+
3013404
+
69d83fe
+
f383ca9
+
1b26f48
+
054f09d
+
0c86829
+
f22d81a
+
e7ebffe
+
72a7a54
+
cc09223
+
ab99f58
+
2c69e37
+
b6ccfbc
+
b92a5da
+
773a133
+
9ee28ff
+
5865e20
+
63c7303
+
73371d0
+
b96f402
+
b36e36b
+
60fa081
+
a1d27a6
+
43e9240
+
9e59ae6
+
be1ce44
+
5a6465d
+
7e455b4
+
83d837e
+
28bc01e
+
215be48
+
efcc8e0
+
5192ae6
+
7e1ba0f
+
dec8ccf
+
94afc0f
+
8c3ea5f
+
d680762
+
9092473
+
06120aa
commit 2d12221
Showing
245 changed files
with
8,489 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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}$/', | ||
), | ||
), | ||
); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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}$/', | ||
), | ||
), | ||
); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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}$/', | ||
), | ||
), | ||
); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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}$/', | ||
), | ||
), | ||
); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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}$/', | ||
), | ||
), | ||
); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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}$/', | ||
), | ||
), | ||
); |
Oops, something went wrong.