mirror of
https://github.com/Respect/Validation.git
synced 2024-06-26 09:10:08 +02:00
328 lines
14 KiB
PHP
328 lines
14 KiB
PHP
<?php
|
|
|
|
/*
|
|
* This file is part of Respect/Validation.
|
|
*
|
|
* (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net>
|
|
*
|
|
* For the full copyright and license information, please view the "LICENSE.md"
|
|
* file that was distributed with this source code.
|
|
*/
|
|
|
|
namespace Respect\Validation\Rules;
|
|
|
|
use Respect\Validation\Exceptions\ComponentException;
|
|
|
|
/**
|
|
* Validates countries in ISO 3166-1.
|
|
*/
|
|
class CountryCode extends AbstractSearcher
|
|
{
|
|
const ALPHA2 = 'alpha-2';
|
|
const ALPHA3 = 'alpha-3';
|
|
const NUMERIC = 'numeric';
|
|
|
|
/**
|
|
* @link http://download.geonames.org/export/dump/countryInfo.txt
|
|
*
|
|
* @var array
|
|
*/
|
|
protected $countryCodeList = array(
|
|
array('AD', 'AND', '020'), // Andorra
|
|
array('AE', 'ARE', '784'), // United Arab Emirates
|
|
array('AF', 'AFG', '004'), // Afghanistan
|
|
array('AG', 'ATG', '028'), // Antigua and Barbuda
|
|
array('AI', 'AIA', '660'), // Anguilla
|
|
array('AL', 'ALB', '008'), // Albania
|
|
array('AM', 'ARM', '051'), // Armenia
|
|
array('AN', 'ANT', '530'), // Netherlands Antilles
|
|
array('AO', 'AGO', '024'), // Angola
|
|
array('AQ', 'ATA', '010'), // Antarctica
|
|
array('AR', 'ARG', '032'), // Argentina
|
|
array('AS', 'ASM', '016'), // American Samoa
|
|
array('AT', 'AUT', '040'), // Austria
|
|
array('AU', 'AUS', '036'), // Australia
|
|
array('AW', 'ABW', '533'), // Aruba
|
|
array('AX', 'ALA', '248'), // Aland Islands
|
|
array('AZ', 'AZE', '031'), // Azerbaijan
|
|
array('BA', 'BIH', '070'), // Bosnia and Herzegovina
|
|
array('BB', 'BRB', '052'), // Barbados
|
|
array('BD', 'BGD', '050'), // Bangladesh
|
|
array('BE', 'BEL', '056'), // Belgium
|
|
array('BF', 'BFA', '854'), // Burkina Faso
|
|
array('BG', 'BGR', '100'), // Bulgaria
|
|
array('BH', 'BHR', '048'), // Bahrain
|
|
array('BI', 'BDI', '108'), // Burundi
|
|
array('BJ', 'BEN', '204'), // Benin
|
|
array('BL', 'BLM', '652'), // Saint Barthelemy
|
|
array('BM', 'BMU', '060'), // Bermuda
|
|
array('BN', 'BRN', '096'), // Brunei
|
|
array('BO', 'BOL', '068'), // Bolivia
|
|
array('BQ', 'BES', '535'), // Bonaire, Saint Eustatius and Saba
|
|
array('BR', 'BRA', '076'), // Brazil
|
|
array('BS', 'BHS', '044'), // Bahamas
|
|
array('BT', 'BTN', '064'), // Bhutan
|
|
array('BV', 'BVT', '074'), // Bouvet Island
|
|
array('BW', 'BWA', '072'), // Botswana
|
|
array('BY', 'BLR', '112'), // Belarus
|
|
array('BZ', 'BLZ', '084'), // Belize
|
|
array('CA', 'CAN', '124'), // Canada
|
|
array('CC', 'CCK', '166'), // Cocos Islands
|
|
array('CD', 'COD', '180'), // Democratic Republic of the Congo
|
|
array('CF', 'CAF', '140'), // Central African Republic
|
|
array('CG', 'COG', '178'), // Republic of the Congo
|
|
array('CH', 'CHE', '756'), // Switzerland
|
|
array('CI', 'CIV', '384'), // Ivory Coast
|
|
array('CK', 'COK', '184'), // Cook Islands
|
|
array('CL', 'CHL', '152'), // Chile
|
|
array('CM', 'CMR', '120'), // Cameroon
|
|
array('CN', 'CHN', '156'), // China
|
|
array('CO', 'COL', '170'), // Colombia
|
|
array('CR', 'CRI', '188'), // Costa Rica
|
|
array('CS', 'SCG', '891'), // Serbia and Montenegro
|
|
array('CU', 'CUB', '192'), // Cuba
|
|
array('CV', 'CPV', '132'), // Cape Verde
|
|
array('CW', 'CUW', '531'), // Curacao
|
|
array('CX', 'CXR', '162'), // Christmas Island
|
|
array('CY', 'CYP', '196'), // Cyprus
|
|
array('CZ', 'CZE', '203'), // Czech Republic
|
|
array('DE', 'DEU', '276'), // Germany
|
|
array('DJ', 'DJI', '262'), // Djibouti
|
|
array('DK', 'DNK', '208'), // Denmark
|
|
array('DM', 'DMA', '212'), // Dominica
|
|
array('DO', 'DOM', '214'), // Dominican Republic
|
|
array('DZ', 'DZA', '012'), // Algeria
|
|
array('EC', 'ECU', '218'), // Ecuador
|
|
array('EE', 'EST', '233'), // Estonia
|
|
array('EG', 'EGY', '818'), // Egypt
|
|
array('EH', 'ESH', '732'), // Western Sahara
|
|
array('ER', 'ERI', '232'), // Eritrea
|
|
array('ES', 'ESP', '724'), // Spain
|
|
array('ET', 'ETH', '231'), // Ethiopia
|
|
array('FI', 'FIN', '246'), // Finland
|
|
array('FJ', 'FJI', '242'), // Fiji
|
|
array('FK', 'FLK', '238'), // Falkland Islands
|
|
array('FM', 'FSM', '583'), // Micronesia
|
|
array('FO', 'FRO', '234'), // Faroe Islands
|
|
array('FR', 'FRA', '250'), // France
|
|
array('GA', 'GAB', '266'), // Gabon
|
|
array('GB', 'GBR', '826'), // United Kingdom
|
|
array('GD', 'GRD', '308'), // Grenada
|
|
array('GE', 'GEO', '268'), // Georgia
|
|
array('GF', 'GUF', '254'), // French Guiana
|
|
array('GG', 'GGY', '831'), // Guernsey
|
|
array('GH', 'GHA', '288'), // Ghana
|
|
array('GI', 'GIB', '292'), // Gibraltar
|
|
array('GL', 'GRL', '304'), // Greenland
|
|
array('GM', 'GMB', '270'), // Gambia
|
|
array('GN', 'GIN', '324'), // Guinea
|
|
array('GP', 'GLP', '312'), // Guadeloupe
|
|
array('GQ', 'GNQ', '226'), // Equatorial Guinea
|
|
array('GR', 'GRC', '300'), // Greece
|
|
array('GS', 'SGS', '239'), // South Georgia and the South Sandwich Islands
|
|
array('GT', 'GTM', '320'), // Guatemala
|
|
array('GU', 'GUM', '316'), // Guam
|
|
array('GW', 'GNB', '624'), // Guinea-Bissau
|
|
array('GY', 'GUY', '328'), // Guyana
|
|
array('HK', 'HKG', '344'), // Hong Kong
|
|
array('HM', 'HMD', '334'), // Heard Island and McDonald Islands
|
|
array('HN', 'HND', '340'), // Honduras
|
|
array('HR', 'HRV', '191'), // Croatia
|
|
array('HT', 'HTI', '332'), // Haiti
|
|
array('HU', 'HUN', '348'), // Hungary
|
|
array('ID', 'IDN', '360'), // Indonesia
|
|
array('IE', 'IRL', '372'), // Ireland
|
|
array('IL', 'ISR', '376'), // Israel
|
|
array('IM', 'IMN', '833'), // Isle of Man
|
|
array('IN', 'IND', '356'), // India
|
|
array('IO', 'IOT', '086'), // British Indian Ocean Territory
|
|
array('IQ', 'IRQ', '368'), // Iraq
|
|
array('IR', 'IRN', '364'), // Iran
|
|
array('IS', 'ISL', '352'), // Iceland
|
|
array('IT', 'ITA', '380'), // Italy
|
|
array('JE', 'JEY', '832'), // Jersey
|
|
array('JM', 'JAM', '388'), // Jamaica
|
|
array('JO', 'JOR', '400'), // Jordan
|
|
array('JP', 'JPN', '392'), // Japan
|
|
array('KE', 'KEN', '404'), // Kenya
|
|
array('KG', 'KGZ', '417'), // Kyrgyzstan
|
|
array('KH', 'KHM', '116'), // Cambodia
|
|
array('KI', 'KIR', '296'), // Kiribati
|
|
array('KM', 'COM', '174'), // Comoros
|
|
array('KN', 'KNA', '659'), // Saint Kitts and Nevis
|
|
array('KP', 'PRK', '408'), // North Korea
|
|
array('KR', 'KOR', '410'), // South Korea
|
|
array('KW', 'KWT', '414'), // Kuwait
|
|
array('KY', 'CYM', '136'), // Cayman Islands
|
|
array('KZ', 'KAZ', '398'), // Kazakhstan
|
|
array('LA', 'LAO', '418'), // Laos
|
|
array('LB', 'LBN', '422'), // Lebanon
|
|
array('LC', 'LCA', '662'), // Saint Lucia
|
|
array('LI', 'LIE', '438'), // Liechtenstein
|
|
array('LK', 'LKA', '144'), // Sri Lanka
|
|
array('LR', 'LBR', '430'), // Liberia
|
|
array('LS', 'LSO', '426'), // Lesotho
|
|
array('LT', 'LTU', '440'), // Lithuania
|
|
array('LU', 'LUX', '442'), // Luxembourg
|
|
array('LV', 'LVA', '428'), // Latvia
|
|
array('LY', 'LBY', '434'), // Libya
|
|
array('MA', 'MAR', '504'), // Morocco
|
|
array('MC', 'MCO', '492'), // Monaco
|
|
array('MD', 'MDA', '498'), // Moldova
|
|
array('ME', 'MNE', '499'), // Montenegro
|
|
array('MF', 'MAF', '663'), // Saint Martin
|
|
array('MG', 'MDG', '450'), // Madagascar
|
|
array('MH', 'MHL', '584'), // Marshall Islands
|
|
array('MK', 'MKD', '807'), // Macedonia
|
|
array('ML', 'MLI', '466'), // Mali
|
|
array('MM', 'MMR', '104'), // Myanmar
|
|
array('MN', 'MNG', '496'), // Mongolia
|
|
array('MO', 'MAC', '446'), // Macao
|
|
array('MP', 'MNP', '580'), // Northern Mariana Islands
|
|
array('MQ', 'MTQ', '474'), // Martinique
|
|
array('MR', 'MRT', '478'), // Mauritania
|
|
array('MS', 'MSR', '500'), // Montserrat
|
|
array('MT', 'MLT', '470'), // Malta
|
|
array('MU', 'MUS', '480'), // Mauritius
|
|
array('MV', 'MDV', '462'), // Maldives
|
|
array('MW', 'MWI', '454'), // Malawi
|
|
array('MX', 'MEX', '484'), // Mexico
|
|
array('MY', 'MYS', '458'), // Malaysia
|
|
array('MZ', 'MOZ', '508'), // Mozambique
|
|
array('NA', 'NAM', '516'), // Namibia
|
|
array('NC', 'NCL', '540'), // New Caledonia
|
|
array('NE', 'NER', '562'), // Niger
|
|
array('NF', 'NFK', '574'), // Norfolk Island
|
|
array('NG', 'NGA', '566'), // Nigeria
|
|
array('NI', 'NIC', '558'), // Nicaragua
|
|
array('NL', 'NLD', '528'), // Netherlands
|
|
array('NO', 'NOR', '578'), // Norway
|
|
array('NP', 'NPL', '524'), // Nepal
|
|
array('NR', 'NRU', '520'), // Nauru
|
|
array('NU', 'NIU', '570'), // Niue
|
|
array('NZ', 'NZL', '554'), // New Zealand
|
|
array('OM', 'OMN', '512'), // Oman
|
|
array('PA', 'PAN', '591'), // Panama
|
|
array('PE', 'PER', '604'), // Peru
|
|
array('PF', 'PYF', '258'), // French Polynesia
|
|
array('PG', 'PNG', '598'), // Papua New Guinea
|
|
array('PH', 'PHL', '608'), // Philippines
|
|
array('PK', 'PAK', '586'), // Pakistan
|
|
array('PL', 'POL', '616'), // Poland
|
|
array('PM', 'SPM', '666'), // Saint Pierre and Miquelon
|
|
array('PN', 'PCN', '612'), // Pitcairn
|
|
array('PR', 'PRI', '630'), // Puerto Rico
|
|
array('PS', 'PSE', '275'), // Palestinian Territory
|
|
array('PT', 'PRT', '620'), // Portugal
|
|
array('PW', 'PLW', '585'), // Palau
|
|
array('PY', 'PRY', '600'), // Paraguay
|
|
array('QA', 'QAT', '634'), // Qatar
|
|
array('RE', 'REU', '638'), // Reunion
|
|
array('RO', 'ROU', '642'), // Romania
|
|
array('RS', 'SRB', '688'), // Serbia
|
|
array('RU', 'RUS', '643'), // Russia
|
|
array('RW', 'RWA', '646'), // Rwanda
|
|
array('SA', 'SAU', '682'), // Saudi Arabia
|
|
array('SB', 'SLB', '090'), // Solomon Islands
|
|
array('SC', 'SYC', '690'), // Seychelles
|
|
array('SD', 'SDN', '729'), // Sudan
|
|
array('SE', 'SWE', '752'), // Sweden
|
|
array('SG', 'SGP', '702'), // Singapore
|
|
array('SH', 'SHN', '654'), // Saint Helena
|
|
array('SI', 'SVN', '705'), // Slovenia
|
|
array('SJ', 'SJM', '744'), // Svalbard and Jan Mayen
|
|
array('SK', 'SVK', '703'), // Slovakia
|
|
array('SL', 'SLE', '694'), // Sierra Leone
|
|
array('SM', 'SMR', '674'), // San Marino
|
|
array('SN', 'SEN', '686'), // Senegal
|
|
array('SO', 'SOM', '706'), // Somalia
|
|
array('SR', 'SUR', '740'), // Suriname
|
|
array('SS', 'SSD', '728'), // South Sudan
|
|
array('ST', 'STP', '678'), // Sao Tome and Principe
|
|
array('SV', 'SLV', '222'), // El Salvador
|
|
array('SX', 'SXM', '534'), // Sint Maarten
|
|
array('SY', 'SYR', '760'), // Syria
|
|
array('SZ', 'SWZ', '748'), // Swaziland
|
|
array('TC', 'TCA', '796'), // Turks and Caicos Islands
|
|
array('TD', 'TCD', '148'), // Chad
|
|
array('TF', 'ATF', '260'), // French Southern Territories
|
|
array('TG', 'TGO', '768'), // Togo
|
|
array('TH', 'THA', '764'), // Thailand
|
|
array('TJ', 'TJK', '762'), // Tajikistan
|
|
array('TK', 'TKL', '772'), // Tokelau
|
|
array('TL', 'TLS', '626'), // East Timor
|
|
array('TM', 'TKM', '795'), // Turkmenistan
|
|
array('TN', 'TUN', '788'), // Tunisia
|
|
array('TO', 'TON', '776'), // Tonga
|
|
array('TR', 'TUR', '792'), // Turkey
|
|
array('TT', 'TTO', '780'), // Trinidad and Tobago
|
|
array('TV', 'TUV', '798'), // Tuvalu
|
|
array('TW', 'TWN', '158'), // Taiwan
|
|
array('TZ', 'TZA', '834'), // Tanzania
|
|
array('UA', 'UKR', '804'), // Ukraine
|
|
array('UG', 'UGA', '800'), // Uganda
|
|
array('UM', 'UMI', '581'), // United States Minor Outlying Islands
|
|
array('US', 'USA', '840'), // United States
|
|
array('UY', 'URY', '858'), // Uruguay
|
|
array('UZ', 'UZB', '860'), // Uzbekistan
|
|
array('VA', 'VAT', '336'), // Vatican
|
|
array('VC', 'VCT', '670'), // Saint Vincent and the Grenadines
|
|
array('VE', 'VEN', '862'), // Venezuela
|
|
array('VG', 'VGB', '092'), // British Virgin Islands
|
|
array('VI', 'VIR', '850'), // U.S. Virgin Islands
|
|
array('VN', 'VNM', '704'), // Vietnam
|
|
array('VU', 'VUT', '548'), // Vanuatu
|
|
array('WF', 'WLF', '876'), // Wallis and Futuna
|
|
array('WS', 'WSM', '882'), // Samoa
|
|
array('XK', 'XKX', '0'), // Kosovo
|
|
array('YE', 'YEM', '887'), // Yemen
|
|
array('YT', 'MYT', '175'), // Mayotte
|
|
array('ZA', 'ZAF', '710'), // South Africa
|
|
array('ZM', 'ZMB', '894'), // Zambia
|
|
array('ZW', 'ZWE', '716'), // Zimbabwe
|
|
|
|
);
|
|
|
|
public $set;
|
|
public $index;
|
|
|
|
public function __construct($set = self::ALPHA2)
|
|
{
|
|
$index = array_search($set, self::getAvailableSets(), true);
|
|
if (false === $index) {
|
|
throw new ComponentException(sprintf('"%s" is not a valid country set for ISO 3166-1', $set));
|
|
}
|
|
|
|
$this->set = $set;
|
|
$this->index = $index;
|
|
}
|
|
|
|
public static function getAvailableSets()
|
|
{
|
|
return array(
|
|
self::ALPHA2,
|
|
self::ALPHA3,
|
|
self::NUMERIC,
|
|
);
|
|
}
|
|
|
|
private function getCountryCodeList($index)
|
|
{
|
|
$countryList = array();
|
|
foreach ($this->countryCodeList as $country) {
|
|
$countryList[] = $country[$index];
|
|
}
|
|
|
|
return $countryList;
|
|
}
|
|
|
|
public function validate($input)
|
|
{
|
|
return in_array(
|
|
strtoupper($input),
|
|
$this->getCountryCodeList($this->index),
|
|
true
|
|
);
|
|
}
|
|
}
|