CountryCode.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375
  1. <?php
  2. /*
  3. * Copyright (c) Alexandre Gomes Gaigalas <alganet@gmail.com>
  4. * SPDX-License-Identifier: MIT
  5. */
  6. declare(strict_types=1);
  7. namespace Respect\Validation\Rules;
  8. use Respect\Validation\Exceptions\ComponentException;
  9. use function array_column;
  10. use function array_keys;
  11. use function implode;
  12. use function sprintf;
  13. /**
  14. * Validates whether the input is a country code in ISO 3166-1 standard.
  15. *
  16. * This rule supports the three sets of country codes (alpha-2, alpha-3, and numeric).
  17. *
  18. * @author Alexandre Gomes Gaigalas <alganet@gmail.com>
  19. * @author Felipe Martins <me@fefas.net>
  20. * @author Henrique Moody <henriquemoody@gmail.com>
  21. * @author William Espindola <oi@williamespindola.com.br>
  22. */
  23. final class CountryCode extends AbstractSearcher
  24. {
  25. /**
  26. * The ISO representation of a country code.
  27. */
  28. public const ALPHA2 = 'alpha-2';
  29. /**
  30. * The ISO3 representation of a country code.
  31. */
  32. public const ALPHA3 = 'alpha-3';
  33. /**
  34. * The ISO-number representation of a country code.
  35. */
  36. public const NUMERIC = 'numeric';
  37. /**
  38. * Position of the indexes of each set in the list of country codes.
  39. */
  40. private const SET_INDEXES = [
  41. self::ALPHA2 => 0,
  42. self::ALPHA3 => 1,
  43. self::NUMERIC => 2,
  44. ];
  45. /**
  46. * @see https://salsa.debian.org/iso-codes-team/iso-codes
  47. */
  48. private const COUNTRY_CODES = [
  49. // begin of auto-generated code
  50. ['AD', 'AND', '020'], // Andorra
  51. ['AE', 'ARE', '784'], // United Arab Emirates
  52. ['AF', 'AFG', '004'], // Afghanistan
  53. ['AG', 'ATG', '028'], // Antigua and Barbuda
  54. ['AI', 'AFI', '262'], // French Afars and Issas
  55. ['AI', 'AIA', '660'], // Anguilla
  56. ['AL', 'ALB', '008'], // Albania
  57. ['AM', 'ARM', '051'], // Armenia
  58. ['AN', 'ANT', '530'], // Netherlands Antilles
  59. ['AO', 'AGO', '024'], // Angola
  60. ['AQ', 'ATA', '010'], // Antarctica
  61. ['AR', 'ARG', '032'], // Argentina
  62. ['AS', 'ASM', '016'], // American Samoa
  63. ['AT', 'AUT', '040'], // Austria
  64. ['AU', 'AUS', '036'], // Australia
  65. ['AW', 'ABW', '533'], // Aruba
  66. ['AX', 'ALA', '248'], // Åland Islands
  67. ['AZ', 'AZE', '031'], // Azerbaijan
  68. ['BA', 'BIH', '070'], // Bosnia and Herzegovina
  69. ['BB', 'BRB', '052'], // Barbados
  70. ['BD', 'BGD', '050'], // Bangladesh
  71. ['BE', 'BEL', '056'], // Belgium
  72. ['BF', 'BFA', '854'], // Burkina Faso
  73. ['BG', 'BGR', '100'], // Bulgaria
  74. ['BH', 'BHR', '048'], // Bahrain
  75. ['BI', 'BDI', '108'], // Burundi
  76. ['BJ', 'BEN', '204'], // Benin
  77. ['BL', 'BLM', '652'], // Saint Barthélemy
  78. ['BM', 'BMU', '060'], // Bermuda
  79. ['BN', 'BRN', '096'], // Brunei Darussalam
  80. ['BO', 'BOL', '068'], // Bolivia, Plurinational State of
  81. ['BQ', 'ATB', null], // British Antarctic Territory
  82. ['BQ', 'BES', '535'], // Bonaire, Sint Eustatius and Saba
  83. ['BR', 'BRA', '076'], // Brazil
  84. ['BS', 'BHS', '044'], // Bahamas
  85. ['BT', 'BTN', '064'], // Bhutan
  86. ['BU', 'BUR', '104'], // Burma, Socialist Republic of the Union of
  87. ['BV', 'BVT', '074'], // Bouvet Island
  88. ['BW', 'BWA', '072'], // Botswana
  89. ['BY', 'BLR', '112'], // Belarus
  90. ['BY', 'BYS', '112'], // Byelorussian SSR Soviet Socialist Republic
  91. ['BZ', 'BLZ', '084'], // Belize
  92. ['CA', 'CAN', '124'], // Canada
  93. ['CC', 'CCK', '166'], // Cocos (Keeling) Islands
  94. ['CD', 'COD', '180'], // Congo, The Democratic Republic of the
  95. ['CF', 'CAF', '140'], // Central African Republic
  96. ['CG', 'COG', '178'], // Congo
  97. ['CH', 'CHE', '756'], // Switzerland
  98. ['CI', 'CIV', '384'], // Côte d'Ivoire
  99. ['CK', 'COK', '184'], // Cook Islands
  100. ['CL', 'CHL', '152'], // Chile
  101. ['CM', 'CMR', '120'], // Cameroon
  102. ['CN', 'CHN', '156'], // China
  103. ['CO', 'COL', '170'], // Colombia
  104. ['CR', 'CRI', '188'], // Costa Rica
  105. ['CS', 'CSK', '200'], // Czechoslovakia, Czechoslovak Socialist Republic
  106. ['CS', 'SCG', '891'], // Serbia and Montenegro
  107. ['CT', 'CTE', '128'], // Canton and Enderbury Islands
  108. ['CU', 'CUB', '192'], // Cuba
  109. ['CV', 'CPV', '132'], // Cabo Verde
  110. ['CW', 'CUW', '531'], // Curaçao
  111. ['CX', 'CXR', '162'], // Christmas Island
  112. ['CY', 'CYP', '196'], // Cyprus
  113. ['CZ', 'CZE', '203'], // Czechia
  114. ['DD', 'DDR', '278'], // German Democratic Republic
  115. ['DE', 'DEU', '276'], // Germany
  116. ['DJ', 'DJI', '262'], // Djibouti
  117. ['DK', 'DNK', '208'], // Denmark
  118. ['DM', 'DMA', '212'], // Dominica
  119. ['DO', 'DOM', '214'], // Dominican Republic
  120. ['DY', 'DHY', '204'], // Dahomey
  121. ['DZ', 'DZA', '012'], // Algeria
  122. ['EC', 'ECU', '218'], // Ecuador
  123. ['EE', 'EST', '233'], // Estonia
  124. ['EG', 'EGY', '818'], // Egypt
  125. ['EH', 'ESH', '732'], // Western Sahara
  126. ['ER', 'ERI', '232'], // Eritrea
  127. ['ES', 'ESP', '724'], // Spain
  128. ['ET', 'ETH', '231'], // Ethiopia
  129. ['FI', 'FIN', '246'], // Finland
  130. ['FJ', 'FJI', '242'], // Fiji
  131. ['FK', 'FLK', '238'], // Falkland Islands (Malvinas)
  132. ['FM', 'FSM', '583'], // Micronesia, Federated States of
  133. ['FO', 'FRO', '234'], // Faroe Islands
  134. ['FQ', 'ATF', null], // French Southern and Antarctic Territories
  135. ['FR', 'FRA', '250'], // France
  136. ['FX', 'FXX', '249'], // France, Metropolitan
  137. ['GA', 'GAB', '266'], // Gabon
  138. ['GB', 'GBR', '826'], // United Kingdom
  139. ['GD', 'GRD', '308'], // Grenada
  140. ['GE', 'GEL', '296'], // Gilbert and Ellice Islands
  141. ['GE', 'GEO', '268'], // Georgia
  142. ['GF', 'GUF', '254'], // French Guiana
  143. ['GG', 'GGY', '831'], // Guernsey
  144. ['GH', 'GHA', '288'], // Ghana
  145. ['GI', 'GIB', '292'], // Gibraltar
  146. ['GL', 'GRL', '304'], // Greenland
  147. ['GM', 'GMB', '270'], // Gambia
  148. ['GN', 'GIN', '324'], // Guinea
  149. ['GP', 'GLP', '312'], // Guadeloupe
  150. ['GQ', 'GNQ', '226'], // Equatorial Guinea
  151. ['GR', 'GRC', '300'], // Greece
  152. ['GS', 'SGS', '239'], // South Georgia and the South Sandwich Islands
  153. ['GT', 'GTM', '320'], // Guatemala
  154. ['GU', 'GUM', '316'], // Guam
  155. ['GW', 'GNB', '624'], // Guinea-Bissau
  156. ['GY', 'GUY', '328'], // Guyana
  157. ['HK', 'HKG', '344'], // Hong Kong
  158. ['HM', 'HMD', '334'], // Heard Island and McDonald Islands
  159. ['HN', 'HND', '340'], // Honduras
  160. ['HR', 'HRV', '191'], // Croatia
  161. ['HT', 'HTI', '332'], // Haiti
  162. ['HU', 'HUN', '348'], // Hungary
  163. ['HV', 'HVO', '854'], // Upper Volta, Republic of
  164. ['ID', 'IDN', '360'], // Indonesia
  165. ['IE', 'IRL', '372'], // Ireland
  166. ['IL', 'ISR', '376'], // Israel
  167. ['IM', 'IMN', '833'], // Isle of Man
  168. ['IN', 'IND', '356'], // India
  169. ['IO', 'IOT', '086'], // British Indian Ocean Territory
  170. ['IQ', 'IRQ', '368'], // Iraq
  171. ['IR', 'IRN', '364'], // Iran, Islamic Republic of
  172. ['IS', 'ISL', '352'], // Iceland
  173. ['IT', 'ITA', '380'], // Italy
  174. ['JE', 'JEY', '832'], // Jersey
  175. ['JM', 'JAM', '388'], // Jamaica
  176. ['JO', 'JOR', '400'], // Jordan
  177. ['JP', 'JPN', '392'], // Japan
  178. ['JT', 'JTN', '396'], // Johnston Island
  179. ['KE', 'KEN', '404'], // Kenya
  180. ['KG', 'KGZ', '417'], // Kyrgyzstan
  181. ['KH', 'KHM', '116'], // Cambodia
  182. ['KI', 'KIR', '296'], // Kiribati
  183. ['KM', 'COM', '174'], // Comoros
  184. ['KN', 'KNA', '659'], // Saint Kitts and Nevis
  185. ['KP', 'PRK', '408'], // Korea, Democratic People's Republic of
  186. ['KR', 'KOR', '410'], // Korea, Republic of
  187. ['KW', 'KWT', '414'], // Kuwait
  188. ['KY', 'CYM', '136'], // Cayman Islands
  189. ['KZ', 'KAZ', '398'], // Kazakhstan
  190. ['LA', 'LAO', '418'], // Lao People's Democratic Republic
  191. ['LB', 'LBN', '422'], // Lebanon
  192. ['LC', 'LCA', '662'], // Saint Lucia
  193. ['LI', 'LIE', '438'], // Liechtenstein
  194. ['LK', 'LKA', '144'], // Sri Lanka
  195. ['LR', 'LBR', '430'], // Liberia
  196. ['LS', 'LSO', '426'], // Lesotho
  197. ['LT', 'LTU', '440'], // Lithuania
  198. ['LU', 'LUX', '442'], // Luxembourg
  199. ['LV', 'LVA', '428'], // Latvia
  200. ['LY', 'LBY', '434'], // Libya
  201. ['MA', 'MAR', '504'], // Morocco
  202. ['MC', 'MCO', '492'], // Monaco
  203. ['MD', 'MDA', '498'], // Moldova, Republic of
  204. ['ME', 'MNE', '499'], // Montenegro
  205. ['MF', 'MAF', '663'], // Saint Martin (French part)
  206. ['MG', 'MDG', '450'], // Madagascar
  207. ['MH', 'MHL', '584'], // Marshall Islands
  208. ['MI', 'MID', '488'], // Midway Islands
  209. ['MK', 'MKD', '807'], // North Macedonia
  210. ['ML', 'MLI', '466'], // Mali
  211. ['MM', 'MMR', '104'], // Myanmar
  212. ['MN', 'MNG', '496'], // Mongolia
  213. ['MO', 'MAC', '446'], // Macao
  214. ['MP', 'MNP', '580'], // Northern Mariana Islands
  215. ['MQ', 'MTQ', '474'], // Martinique
  216. ['MR', 'MRT', '478'], // Mauritania
  217. ['MS', 'MSR', '500'], // Montserrat
  218. ['MT', 'MLT', '470'], // Malta
  219. ['MU', 'MUS', '480'], // Mauritius
  220. ['MV', 'MDV', '462'], // Maldives
  221. ['MW', 'MWI', '454'], // Malawi
  222. ['MX', 'MEX', '484'], // Mexico
  223. ['MY', 'MYS', '458'], // Malaysia
  224. ['MZ', 'MOZ', '508'], // Mozambique
  225. ['NA', 'NAM', '516'], // Namibia
  226. ['NC', 'NCL', '540'], // New Caledonia
  227. ['NE', 'NER', '562'], // Niger
  228. ['NF', 'NFK', '574'], // Norfolk Island
  229. ['NG', 'NGA', '566'], // Nigeria
  230. ['NH', 'NHB', '548'], // New Hebrides
  231. ['NI', 'NIC', '558'], // Nicaragua
  232. ['NL', 'NLD', '528'], // Netherlands
  233. ['NO', 'NOR', '578'], // Norway
  234. ['NP', 'NPL', '524'], // Nepal
  235. ['NQ', 'ATN', '216'], // Dronning Maud Land
  236. ['NR', 'NRU', '520'], // Nauru
  237. ['NT', 'NTZ', '536'], // Neutral Zone
  238. ['NU', 'NIU', '570'], // Niue
  239. ['NZ', 'NZL', '554'], // New Zealand
  240. ['OM', 'OMN', '512'], // Oman
  241. ['PA', 'PAN', '591'], // Panama
  242. ['PC', 'PCI', '582'], // Pacific Islands (trust territory)
  243. ['PE', 'PER', '604'], // Peru
  244. ['PF', 'PYF', '258'], // French Polynesia
  245. ['PG', 'PNG', '598'], // Papua New Guinea
  246. ['PH', 'PHL', '608'], // Philippines
  247. ['PK', 'PAK', '586'], // Pakistan
  248. ['PL', 'POL', '616'], // Poland
  249. ['PM', 'SPM', '666'], // Saint Pierre and Miquelon
  250. ['PN', 'PCN', '612'], // Pitcairn
  251. ['PR', 'PRI', '630'], // Puerto Rico
  252. ['PS', 'PSE', '275'], // Palestine, State of
  253. ['PT', 'PRT', '620'], // Portugal
  254. ['PU', 'PUS', '849'], // US Miscellaneous Pacific Islands
  255. ['PW', 'PLW', '585'], // Palau
  256. ['PY', 'PRY', '600'], // Paraguay
  257. ['PZ', 'PCZ', null], // Panama Canal Zone
  258. ['QA', 'QAT', '634'], // Qatar
  259. ['RE', 'REU', '638'], // Réunion
  260. ['RH', 'RHO', '716'], // Southern Rhodesia
  261. ['RO', 'ROU', '642'], // Romania
  262. ['RS', 'SRB', '688'], // Serbia
  263. ['RU', 'RUS', '643'], // Russian Federation
  264. ['RW', 'RWA', '646'], // Rwanda
  265. ['SA', 'SAU', '682'], // Saudi Arabia
  266. ['SB', 'SLB', '090'], // Solomon Islands
  267. ['SC', 'SYC', '690'], // Seychelles
  268. ['SD', 'SDN', '729'], // Sudan
  269. ['SE', 'SWE', '752'], // Sweden
  270. ['SG', 'SGP', '702'], // Singapore
  271. ['SH', 'SHN', '654'], // Saint Helena, Ascension and Tristan da Cunha
  272. ['SI', 'SVN', '705'], // Slovenia
  273. ['SJ', 'SJM', '744'], // Svalbard and Jan Mayen
  274. ['SK', 'SKM', null], // Sikkim
  275. ['SK', 'SVK', '703'], // Slovakia
  276. ['SL', 'SLE', '694'], // Sierra Leone
  277. ['SM', 'SMR', '674'], // San Marino
  278. ['SN', 'SEN', '686'], // Senegal
  279. ['SO', 'SOM', '706'], // Somalia
  280. ['SR', 'SUR', '740'], // Suriname
  281. ['SS', 'SSD', '728'], // South Sudan
  282. ['ST', 'STP', '678'], // Sao Tome and Principe
  283. ['SU', 'SUN', '810'], // USSR, Union of Soviet Socialist Republics
  284. ['SV', 'SLV', '222'], // El Salvador
  285. ['SX', 'SXM', '534'], // Sint Maarten (Dutch part)
  286. ['SY', 'SYR', '760'], // Syrian Arab Republic
  287. ['SZ', 'SWZ', '748'], // Eswatini
  288. ['TC', 'TCA', '796'], // Turks and Caicos Islands
  289. ['TD', 'TCD', '148'], // Chad
  290. ['TF', 'ATF', '260'], // French Southern Territories
  291. ['TG', 'TGO', '768'], // Togo
  292. ['TH', 'THA', '764'], // Thailand
  293. ['TJ', 'TJK', '762'], // Tajikistan
  294. ['TK', 'TKL', '772'], // Tokelau
  295. ['TL', 'TLS', '626'], // Timor-Leste
  296. ['TM', 'TKM', '795'], // Turkmenistan
  297. ['TN', 'TUN', '788'], // Tunisia
  298. ['TO', 'TON', '776'], // Tonga
  299. ['TP', 'TMP', '626'], // East Timor
  300. ['TR', 'TUR', '792'], // Türkiye
  301. ['TT', 'TTO', '780'], // Trinidad and Tobago
  302. ['TV', 'TUV', '798'], // Tuvalu
  303. ['TW', 'TWN', '158'], // Taiwan, Province of China
  304. ['TZ', 'TZA', '834'], // Tanzania, United Republic of
  305. ['UA', 'UKR', '804'], // Ukraine
  306. ['UG', 'UGA', '800'], // Uganda
  307. ['UM', 'UMI', '581'], // United States Minor Outlying Islands
  308. ['US', 'USA', '840'], // United States
  309. ['UY', 'URY', '858'], // Uruguay
  310. ['UZ', 'UZB', '860'], // Uzbekistan
  311. ['VA', 'VAT', '336'], // Holy See (Vatican City State)
  312. ['VC', 'VCT', '670'], // Saint Vincent and the Grenadines
  313. ['VD', 'VDR', null], // Viet-Nam, Democratic Republic of
  314. ['VE', 'VEN', '862'], // Venezuela, Bolivarian Republic of
  315. ['VG', 'VGB', '092'], // Virgin Islands, British
  316. ['VI', 'VIR', '850'], // Virgin Islands, U.S.
  317. ['VN', 'VNM', '704'], // Viet Nam
  318. ['VU', 'VUT', '548'], // Vanuatu
  319. ['WF', 'WLF', '876'], // Wallis and Futuna
  320. ['WK', 'WAK', '872'], // Wake Island
  321. ['WS', 'WSM', '882'], // Samoa
  322. ['YD', 'YMD', '720'], // Yemen, Democratic, People's Democratic Republic of
  323. ['YE', 'YEM', '887'], // Yemen
  324. ['YT', 'MYT', '175'], // Mayotte
  325. ['YU', 'YUG', '891'], // Yugoslavia, Socialist Federal Republic of
  326. ['ZA', 'ZAF', '710'], // South Africa
  327. ['ZM', 'ZMB', '894'], // Zambia
  328. ['ZR', 'ZAR', '180'], // Zaire, Republic of
  329. ['ZW', 'ZWE', '716'], // Zimbabwe
  330. // end of auto-generated code
  331. ];
  332. /**
  333. * @var string
  334. */
  335. private $set;
  336. /**
  337. * Initializes the rule.
  338. *
  339. * @throws ComponentException If $set is not a valid set
  340. */
  341. public function __construct(string $set = self::ALPHA2)
  342. {
  343. if (!isset(self::SET_INDEXES[$set])) {
  344. throw new ComponentException(
  345. sprintf(
  346. '"%s" is not a valid set for ISO 3166-1 (Available: %s)',
  347. $set,
  348. implode(', ', array_keys(self::SET_INDEXES))
  349. )
  350. );
  351. }
  352. $this->set = $set;
  353. }
  354. /**
  355. * {@inheritDoc}
  356. */
  357. protected function getDataSource($input = null): array
  358. {
  359. return array_column(self::COUNTRY_CODES, self::SET_INDEXES[$this->set]);
  360. }
  361. }