mirror of
https://github.com/Respect/Validation.git
synced 2026-03-16 07:15:45 +01:00
- Turn rule case insensitive - Use default pattern for countries who doesn't have postal code
183 lines
6.4 KiB
PHP
183 lines
6.4 KiB
PHP
<?php
|
|
|
|
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 = array(
|
|
"AD" => "/^(?:AD)*(\d{3})$/",
|
|
"AM" => "/^(\d{6})$/",
|
|
"AR" => "/^([A-Z]\d{4}[A-Z]{3})$/",
|
|
"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?)$/",
|
|
"BM" => "/^([A-Z]{2}\d{2})$/",
|
|
"BN" => "/^([A-Z]{2}\d{4})$/",
|
|
"BR" => "/^(\d{8}|\d{5}-\d{3})$/",
|
|
"BY" => "/^(\d{6})$/",
|
|
"CA" => "/^([ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ]) ?(\d[ABCEGHJKLMNPRSTVWXYZ]\d)$/",
|
|
"CH" => "/^(\d{4})$/",
|
|
"CL" => "/^(\d{7})$/",
|
|
"CN" => "/^(\d{6})$/",
|
|
"CR" => "/^(\d{4})$/",
|
|
"CS" => "/^(\d{5})$/",
|
|
"CU" => "/^(?:CP)*(\d{5})$/",
|
|
"CV" => "/^(\d{4})$/",
|
|
"CX" => "/^(\d{4})$/",
|
|
"CY" => "/^(\d{4})$/",
|
|
"CZ" => "/^(\d{5})$/",
|
|
"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" => "/^(([A-Z]\d{2}[A-Z]{2})|([A-Z]\d{3}[A-Z]{2})|([A-Z]{2}\d{2}[A-Z]{2})|([A-Z]{2}\d{3}[A-Z]{2})|([A-Z]\d[A-Z]\d[A-Z]{2})|([A-Z]{2}\d[A-Z]\d[A-Z]{2})|(GIR0AA))$/",
|
|
"GE" => "/^(\d{4})$/",
|
|
"GF" => "/^((97|98)3\d{2})$/",
|
|
"GG" => "/^(([A-Z]\d{2}[A-Z]{2})|([A-Z]\d{3}[A-Z]{2})|([A-Z]{2}\d{2}[A-Z]{2})|([A-Z]{2}\d{3}[A-Z]{2})|([A-Z]\d[A-Z]\d[A-Z]{2})|([A-Z]{2}\d[A-Z]\d[A-Z]{2})|(GIR0AA))$/",
|
|
"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})$/",
|
|
"IL" => "/^(\d{5})$/",
|
|
"IM" => "/^(([A-Z]\d{2}[A-Z]{2})|([A-Z]\d{3}[A-Z]{2})|([A-Z]{2}\d{2}[A-Z]{2})|([A-Z]{2}\d{3}[A-Z]{2})|([A-Z]\d[A-Z]\d[A-Z]{2})|([A-Z]{2}\d[A-Z]\d[A-Z]{2})|(GIR0AA))$/",
|
|
"IN" => "/^(\d{6})$/",
|
|
"IQ" => "/^(\d{5})$/",
|
|
"IR" => "/^(\d{10})$/",
|
|
"IS" => "/^(\d{3})$/",
|
|
"IT" => "/^(\d{5})$/",
|
|
"JE" => "/^(([A-Z]\d{2}[A-Z]{2})|([A-Z]\d{3}[A-Z]{2})|([A-Z]{2}\d{2}[A-Z]{2})|([A-Z]{2}\d{3}[A-Z]{2})|([A-Z]\d[A-Z]\d[A-Z]{2})|([A-Z]{2}\d[A-Z]\d[A-Z]{2})|(GIR0AA))$/",
|
|
"JO" => "/^(\d{5})$/",
|
|
"JP" => "/^(\d{7})$/",
|
|
"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" => "/^(\d{4})$/",
|
|
"LV" => "/^(?:LV)*(\d{4})$/",
|
|
"MA" => "/^(\d{5})$/",
|
|
"MC" => "/^(\d{5})$/",
|
|
"MD" => "/^(?:MD)*(\d{4})$/",
|
|
"ME" => "/^(\d{5})$/",
|
|
"MG" => "/^(\d{3})$/",
|
|
"MK" => "/^(\d{4})$/",
|
|
"MM" => "/^(\d{5})$/",
|
|
"MN" => "/^(\d{6})$/",
|
|
"MQ" => "/^(\d{5})$/",
|
|
"MT" => "/^([A-Z]{3}\d{2}\d?)$/",
|
|
"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{5})$/",
|
|
"PM" => "/^(97500)$/",
|
|
"PR" => "/^(\d{9})$/",
|
|
"PT" => "/^(\d{7})$/",
|
|
"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{5})$/",
|
|
"SG" => "/^(\d{6})$/",
|
|
"SH" => "/^(STHL1ZZ)$/",
|
|
"SI" => "/^(?:SI)*(\d{4})$/",
|
|
"SK" => "/^(\d{5})$/",
|
|
"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" => "/^\d{5}(-\d{4})?$/",
|
|
"VN" => "/^(\d{6})$/",
|
|
"WF" => "/^(986\d{2})$/",
|
|
"YT" => "/^(\d{5})$/",
|
|
"ZA" => "/^(\d{4})$/",
|
|
"ZM" => "/^(\d{5})$/",
|
|
);
|
|
|
|
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];
|
|
}
|
|
|
|
parent::__construct($regex);
|
|
}
|
|
}
|