mirror of
https://github.com/Respect/Validation.git
synced 2026-03-15 23:05:45 +01:00
Updated the whole list according to the last version found on geonames.org. The script that I executed to generate the list is: curl -L http://download.geonames.org/export/dump/countryInfo.txt | sed 's,\t,\;,g' | sort -u | cut -d ';' -f 1,15 | sed -E "/^#/d; /^[A-Z]{2}\;$/d; s,([A-Z]{2})\;(.+),'\1' => '/\2/'\,,g" After generating the list I few changes had to be made since some of the postal codes in the list were manually updated because they were not correct. This change was made because James Macon reported that "110231" was not recognized as a valid Colombian postal code. Signed-off-by: Henrique Moody <henriquemoody@gmail.com>
205 lines
6.9 KiB
PHP
205 lines
6.9 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;
|
|
|
|
class PostalCode extends Regex
|
|
{
|
|
const DEFAULT_PATTERN = '/^$/';
|
|
|
|
/**
|
|
* @link http://download.geonames.org/export/dump/countryInfo.txt
|
|
*/
|
|
public $postalCodes = [
|
|
'AD' => '/^(?:AD)*(\d{3})$/',
|
|
'AL' => '/^(\d{4})$/',
|
|
'AM' => '/^(\d{6})$/',
|
|
'AR' => '/^[A-Z]?\d{4}[A-Z]{0,3}$/',
|
|
'AS' => '/96799/',
|
|
'AT' => '/^(\d{4})$/',
|
|
'AU' => '/^(\d{4})$/',
|
|
'AX' => '/^(?:FI)*(\d{5})$/',
|
|
'AZ' => '/^(?:AZ)*(\d{4})$/',
|
|
'BA' => '/^(\d{5})$/',
|
|
'BB' => '/^(?:BB)*(\d{5})$/',
|
|
'BD' => '/^(\d{4})$/',
|
|
'BE' => '/^(\d{4})$/',
|
|
'BG' => '/^(\d{4})$/',
|
|
'BH' => '/^(\d{3}\d?)$/',
|
|
'BL' => '/^(\d{5})$/',
|
|
'BM' => '/^([A-Z]{2}\d{2})$/',
|
|
'BN' => '/^([A-Z]{2}\d{4})$/',
|
|
'BR' => '/^\d{5}-?\d{3}$/',
|
|
'BY' => '/^(\d{6})$/',
|
|
'CA' => '/^([ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ]) ?(\d[ABCEGHJKLMNPRSTVWXYZ]\d)$ /',
|
|
'CH' => '/^(\d{4})$/',
|
|
'CL' => '/^(\d{7})$/',
|
|
'CN' => '/^(\d{6})$/',
|
|
'CO' => '/^(\d{6})$/',
|
|
'CR' => '/^(\d{5})$/',
|
|
'CS' => '/^(\d{5})$/',
|
|
'CU' => '/^(?:CP)*(\d{5})$/',
|
|
'CV' => '/^(\d{4})$/',
|
|
'CX' => '/^(\d{4})$/',
|
|
'CY' => '/^(\d{4})$/',
|
|
'CZ' => '/^\d{3}\s?\d{2}$/',
|
|
'DE' => '/^(\d{5})$/',
|
|
'DK' => '/^(\d{4})$/',
|
|
'DO' => '/^(\d{5})$/',
|
|
'DZ' => '/^(\d{5})$/',
|
|
'EC' => '/^([a-zA-Z]\d{4}[a-zA-Z])$/',
|
|
'EE' => '/^(\d{5})$/',
|
|
'EG' => '/^(\d{5})$/',
|
|
'ES' => '/^(\d{5})$/',
|
|
'ET' => '/^(\d{4})$/',
|
|
'FI' => '/^(?:FI)*(\d{5})$/',
|
|
'FM' => '/^(\d{5})$/',
|
|
'FO' => '/^(?:FO)*(\d{3})$/',
|
|
'FR' => '/^(\d{5})$/',
|
|
'GB' => '/^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2})$/',
|
|
'GE' => '/^(\d{4})$/',
|
|
'GF' => '/^((97|98)3\d{2})$/',
|
|
'GG' => '/^((?:(?:[A-PR-UWYZ][A-HK-Y]\d[ABEHMNPRV-Y0-9]|[A-PR-UWYZ]\d[A-HJKPS-UW0-9])\s\d[ABD-HJLNP-UW-Z]{2})|GIR\s?0AA)$/',
|
|
'GL' => '/^(\d{4})$/',
|
|
'GP' => '/^((97|98)\d{3})$/',
|
|
'GR' => '/^(\d{5})$/',
|
|
'GT' => '/^(\d{5})$/',
|
|
'GU' => '/^(969\d{2})$/',
|
|
'GW' => '/^(\d{4})$/',
|
|
'HN' => '/^([A-Z]{2}\d{4})$/',
|
|
'HR' => '/^(?:HR)*(\d{5})$/',
|
|
'HT' => '/^(?:HT)*(\d{4})$/',
|
|
'HU' => '/^(\d{4})$/',
|
|
'ID' => '/^(\d{5})$/',
|
|
'IE' => '/^[A-Z]\d{2}$|^[A-Z]{3}[A-Z]{4}$/',
|
|
'IL' => '/^(\d{5})$/',
|
|
'IM' => '/^((?:(?:[A-PR-UWYZ][A-HK-Y]\d[ABEHMNPRV-Y0-9]|[A-PR-UWYZ]\d[A-HJKPS-UW0-9])\s\d[ABD-HJLNP-UW-Z]{2})|GIR\s?0AA)$/',
|
|
'IN' => '/^(\d{6})$/',
|
|
'IQ' => '/^(\d{5})$/',
|
|
'IR' => '/^(\d{10})$/',
|
|
'IS' => '/^(\d{3})$/',
|
|
'IT' => '/^(\d{5})$/',
|
|
'JE' => '/^((?:(?:[A-PR-UWYZ][A-HK-Y]\d[ABEHMNPRV-Y0-9]|[A-PR-UWYZ]\d[A-HJKPS-UW0-9])\s\d[ABD-HJLNP-UW-Z]{2})|GIR\s?0AA)$/',
|
|
'JO' => '/^(\d{5})$/',
|
|
'JP' => '/^\d{3}-\d{4}$/',
|
|
'KE' => '/^(\d{5})$/',
|
|
'KG' => '/^(\d{6})$/',
|
|
'KH' => '/^(\d{5})$/',
|
|
'KP' => '/^(\d{6})$/',
|
|
'KR' => '/^(?:SEOUL)*(\d{6})$/',
|
|
'KW' => '/^(\d{5})$/',
|
|
'KZ' => '/^(\d{6})$/',
|
|
'LA' => '/^(\d{5})$/',
|
|
'LB' => '/^(\d{4}(\d{4})?)$/',
|
|
'LI' => '/^(\d{4})$/',
|
|
'LK' => '/^(\d{5})$/',
|
|
'LR' => '/^(\d{4})$/',
|
|
'LS' => '/^(\d{3})$/',
|
|
'LT' => '/^(?:LT)*(\d{5})$/',
|
|
'LU' => '/^(?:L-)?\d{4}$/',
|
|
'LV' => '/^(?:LV)*(\d{4})$/',
|
|
'MA' => '/^(\d{5})$/',
|
|
'MC' => '/^(\d{5})$/',
|
|
'MD' => '/^MD-\d{4}$/',
|
|
'ME' => '/^(\d{5})$/',
|
|
'MF' => '/^(\d{5})$/',
|
|
'MG' => '/^(\d{3})$/',
|
|
'MH' => '/^969\d{2}(-\d{4})$/',
|
|
'MK' => '/^(\d{4})$/',
|
|
'MM' => '/^(\d{5})$/',
|
|
'MN' => '/^(\d{6})$/',
|
|
'MP' => '/^9695\d{1}$/',
|
|
'MQ' => '/^(\d{5})$/',
|
|
'MT' => '/^[A-Z]{3}\s?\d{4}$/',
|
|
'MV' => '/^(\d{5})$/',
|
|
'MX' => '/^(\d{5})$/',
|
|
'MY' => '/^(\d{5})$/',
|
|
'MZ' => '/^(\d{4})$/',
|
|
'NC' => '/^(\d{5})$/',
|
|
'NE' => '/^(\d{4})$/',
|
|
'NF' => '/^(\d{4})$/',
|
|
'NG' => '/^(\d{6})$/',
|
|
'NI' => '/^(\d{7})$/',
|
|
'NL' => '/^(\d{4} ?[A-Z]{2})$/',
|
|
'NO' => '/^(\d{4})$/',
|
|
'NP' => '/^(\d{5})$/',
|
|
'NZ' => '/^(\d{4})$/',
|
|
'OM' => '/^(\d{3})$/',
|
|
'PF' => '/^((97|98)7\d{2})$/',
|
|
'PG' => '/^(\d{3})$/',
|
|
'PH' => '/^(\d{4})$/',
|
|
'PK' => '/^(\d{5})$/',
|
|
'PL' => '/^\d{2}-\d{3}$/',
|
|
'PM' => '/^(97500)$/',
|
|
'PR' => '/^00[679]\d{2}(?:-\d{4})?$/',
|
|
'PT' => '/^\d{4}-?\d{3}$/',
|
|
'PW' => '/^(96940)$/',
|
|
'PY' => '/^(\d{4})$/',
|
|
'RE' => '/^((97|98)(4|7|8)\d{2})$/',
|
|
'RO' => '/^(\d{6})$/',
|
|
'RS' => '/^(\d{6})$/',
|
|
'RU' => '/^(\d{6})$/',
|
|
'SA' => '/^(\d{5})$/',
|
|
'SD' => '/^(\d{5})$/',
|
|
'SE' => '/^(?:SE)?\d{3}\s\d{2}$/',
|
|
'SG' => '/^(\d{6})$/',
|
|
'SH' => '/^(STHL1ZZ)$/',
|
|
'SI' => '/^(?:SI)*(\d{4})$/',
|
|
'SJ' => '/^(\d{4})$/',
|
|
'SK' => '/^\d{3}\s?\d{2}$/',
|
|
'SM' => '/^(4789\d)$/',
|
|
'SN' => '/^(\d{5})$/',
|
|
'SO' => '/^([A-Z]{2}\d{5})$/',
|
|
'SV' => '/^(?:CP)*(\d{4})$/',
|
|
'SZ' => '/^([A-Z]\d{3})$/',
|
|
'TC' => '/^(TKCA 1ZZ)$/',
|
|
'TH' => '/^(\d{5})$/',
|
|
'TJ' => '/^(\d{6})$/',
|
|
'TM' => '/^(\d{6})$/',
|
|
'TN' => '/^(\d{4})$/',
|
|
'TR' => '/^(\d{5})$/',
|
|
'TW' => '/^(\d{5})$/',
|
|
'UA' => '/^(\d{5})$/',
|
|
'US' => '/^\d{5}(-\d{4})?$/',
|
|
'UY' => '/^(\d{5})$/',
|
|
'UZ' => '/^(\d{6})$/',
|
|
'VA' => '/^(\d{5})$/',
|
|
'VE' => '/^(\d{4})$/',
|
|
'VI' => '/^008\d{2}(?:-\d{4})?$/',
|
|
'VN' => '/^(\d{6})$/',
|
|
'WF' => '/^(986\d{2})$/',
|
|
'YT' => '/^(\d{5})$/',
|
|
'ZA' => '/^(\d{4})$/',
|
|
'ZM' => '/^(\d{5})$/',
|
|
];
|
|
|
|
public $countryCode;
|
|
|
|
public function __construct($countryCode, CountryCode $countryCodeRule = null)
|
|
{
|
|
$countryCodeRule = $countryCodeRule ?: new CountryCode();
|
|
if (!$countryCodeRule->validate($countryCode)) {
|
|
throw new ComponentException(sprintf('Cannot validate postal code from "%s" country', $countryCode));
|
|
}
|
|
|
|
$regex = self::DEFAULT_PATTERN;
|
|
$upperCountryCode = strtoupper($countryCode);
|
|
if (isset($this->postalCodes[$upperCountryCode])) {
|
|
$regex = $this->postalCodes[$upperCountryCode];
|
|
}
|
|
|
|
$this->countryCode = $countryCode;
|
|
|
|
parent::__construct($regex);
|
|
}
|
|
}
|