Skip to content

Commit 9cc67b3

Browse files
author
heathdutton
committed
Add regex validation before lookup.
1 parent d8875e5 commit 9cc67b3

File tree

2 files changed

+176
-111
lines changed

2 files changed

+176
-111
lines changed

update.php

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
<?php
2-
2+
/**
3+
* Generate folders and repos for each country to each serve as a database.
4+
*/
35
error_reporting(E_ALL);
46
ini_set('display_errors', '1');
57

6-
//die(minPostal('FR 54311 CEDEX', 'FR'));
7-
88
$cwd = dirname(realpath(__FILE__));
99
$zipfile = $cwd.'/allCountries.zip';
1010
$txtfile = $cwd.'/allCountries.txt';
@@ -34,8 +34,8 @@
3434
}
3535
}
3636

37-
// echo "Cleaning up from previous build...\n";
38-
// clean($cwd);
37+
echo "Cleaning up from previous build...\n";
38+
clean($cwd);
3939

4040
$row = 0;
4141
$headers = [
@@ -156,10 +156,9 @@
156156
$cwd.'/key.js',
157157
'var key = '.json_encode($key).';'
158158
);
159+
die(var_export($key, true));
159160
}
160161

161-
die(var_export($key, true));
162-
163162
/**
164163
* Recursively delete files within a directory based on type.
165164
* @param $dir
@@ -170,7 +169,7 @@ function clean($dir, $types = ['json', 'jsonp'])
170169
if (is_dir($dir)) {
171170
$objects = scandir($dir);
172171
foreach ($objects as $object) {
173-
if ($object != "." && $object != "..") {
172+
if ($object != "." && $object != ".." && $object != "key.json") {
174173
if (is_dir($dir."/".$object)) {
175174
clean($dir."/".$object, $types);
176175
} else {

zipcodes.js

Lines changed: 169 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -3,96 +3,125 @@
33
*
44
* Example:
55
*
6-
* getZipCode('US', '90210', function (zip) {
7-
* console.log(zip);
6+
* getZipCode('US', '90210', function (result) {
7+
* console.log(result);
88
* });
9-
*
9+
*
1010
*/
1111
var getZipCode = function (country, zip, callback) {
12-
var key = {
13-
'AD': 0,
14-
'AR': 2,
15-
'AS': 0,
16-
'AT': 2,
17-
'AU': 2,
18-
'AX': 0,
19-
'BD': 1,
20-
'BE': 1,
21-
'BG': 1,
22-
'BM': 0,
23-
'BR': 1,
24-
'BY': 1,
25-
'CA': 1,
26-
'CH': 1,
27-
'CO': 1,
28-
'CR': 0,
29-
'CZ': 2,
30-
'DE': 2,
31-
'DK': 1,
32-
'DO': 0,
33-
'DZ': 2,
34-
'ES': 2,
35-
'FI': 1,
36-
'FO': 0,
37-
'FR': 2,
38-
'GB': 2,
39-
'GF': 0,
40-
'GG': 0,
41-
'GL': 0,
42-
'GP': 0,
43-
'GT': 0,
44-
'GU': 0,
45-
'HR': 1,
46-
'HU': 1,
47-
'IE': 0,
48-
'IM': 0,
49-
'IN': 3,
50-
'IS': 0,
51-
'IT': 2,
52-
'JE': 0,
53-
'JP': 3,
54-
'LI': 0,
55-
'LK': 1,
56-
'LT': 2,
57-
'LU': 1,
58-
'LV': 1,
59-
'MC': 0,
60-
'MD': 1,
61-
'MH': 0,
62-
'MK': 0,
63-
'MP': 0,
64-
'MQ': 0,
65-
'MT': 0,
66-
'MX': 3,
67-
'MY': 1,
68-
'NC': 0,
69-
'NL': 1,
70-
'NO': 1,
71-
'NZ': 1,
72-
'PH': 1,
73-
'PK': 2,
74-
'PL': 2,
75-
'PM': 0,
76-
'PR': 0,
77-
'PT': 3,
78-
'RE': 0,
79-
'RO': 2,
80-
'RU': 2,
81-
'SE': 2,
82-
'SI': 0,
83-
'SJ': 0,
84-
'SK': 1,
85-
'SM': 0,
86-
'TH': 0,
87-
'TR': 2,
88-
'UA': 2,
89-
'US': 2,
90-
'UY': 1,
91-
'VA': 0,
92-
'VI': 0,
93-
'WF': 0,
94-
'YT': 0,
95-
'ZA': 1
12+
var keys = {
13+
AD: 0,
14+
AR: 2,
15+
AS: 0,
16+
AT: 2,
17+
AU: 2,
18+
AX: 0,
19+
BD: 1,
20+
BE: 1,
21+
BG: 1,
22+
BM: 0,
23+
BR: 1,
24+
BY: 1,
25+
CA: 1,
26+
CH: 1,
27+
CO: 1,
28+
CR: 0,
29+
CZ: 2,
30+
DE: 2,
31+
DK: 1,
32+
DO: 0,
33+
DZ: 2,
34+
ES: 2,
35+
FI: 1,
36+
FO: 0,
37+
FR: 2,
38+
GB: 2,
39+
GF: 0,
40+
GG: 0,
41+
GL: 0,
42+
GP: 0,
43+
GT: 0,
44+
GU: 0,
45+
HR: 1,
46+
HU: 1,
47+
IE: 0,
48+
IM: 0,
49+
IN: 3,
50+
IS: 0,
51+
IT: 2,
52+
JE: 0,
53+
JP: 3,
54+
LI: 0,
55+
LK: 1,
56+
LT: 2,
57+
LU: 1,
58+
LV: 1,
59+
MC: 0,
60+
MD: 1,
61+
MH: 0,
62+
MK: 0,
63+
MP: 0,
64+
MQ: 0,
65+
MT: 0,
66+
MX: 3,
67+
MY: 1,
68+
NC: 0,
69+
NL: 1,
70+
NO: 1,
71+
NZ: 1,
72+
PH: 1,
73+
PK: 2,
74+
PL: 2,
75+
PM: 0,
76+
PR: 0,
77+
PT: 3,
78+
RE: 0,
79+
RO: 2,
80+
RU: 2,
81+
SE: 2,
82+
SI: 0,
83+
SJ: 0,
84+
SK: 1,
85+
SM: 0,
86+
TH: 0,
87+
TR: 2,
88+
UA: 2,
89+
US: 2,
90+
UY: 1,
91+
VA: 0,
92+
VI: 0,
93+
WF: 0,
94+
YT: 0,
95+
ZA: 1
96+
},
97+
patterns = {
98+
AD: /^(([a-zA-Z]{2}\d{3})|(\d{4}))$/,
99+
AM_AZ_BJ_BY_CN_IN_KG_KZ_MN_RO_RS_RU_SG_TJ_TM_UZ: /^[0-9]{6}$/,
100+
AR: /^((\d{4})|([a-zA-Z]{1}\d{4}[a-zA-Z]{3}))$/,
101+
AS_BA_CS_CU_DE_DZ_EE_ES_FI_FM_GF_GP_GT_GU_HR_IC_ID_IL_IT_KE_KW_LT_MA_ME_MH_MM_MP_MQ_MX_MY_PK_PM_PR_PS_PW_RE_SA_SM_TH_TR_UA_UY_VI_VN_YU_ZM: /^[0-9]{5}$/,
102+
AT_AU_BD_BE_BG_CH_CX_CY_DK_GL_GW_HU_LI_LU_MD_MK_MZ_NO_NZ_PH_SD_SI_TN_VE_XK_ZA: /^[0-9]{4}$/,
103+
BM: /^[a-zA-Z]{2}\s\d{2}$/,
104+
BN: /^[a-zA-Z]{2}\d{4}$/,
105+
BR: /^(\d{5})(-\d{3})?$/,
106+
CA: /^[ABCEGHJKLMNPRSTVXY]{1}\d{1}[A-Z]{1} *\d{1}[A-Z]{1}\d{1}$/,
107+
CZ_GR_SE_SK: /^[0-9]{3}\s?[0-9]{2}$/,
108+
FO: /^([a-zA-Z]{2}-)?(\d{3})?$/,
109+
FR: /^((0[1-9])|([1-8][0-9])|(9[0-8])|(2A)|(2B))[0-9]{3}$/,
110+
GB: /^GIR?0AA|[A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]|[A-HK-Y][0-9]([0-9]|[ABEHMNPRV-Y]))|[0-9][A-HJKS-UW])?[0-9][ABD-HJLNP-UW-Z]{2}$/,
111+
GE: /^((\d{4})|(\d{6}))$/,
112+
IE: /^(([a-zA-Z]{2}(\s(([a-zA-Z0-9]{1})|(\d{2})))?)|([a-zA-Z]{3}))$/,
113+
IS_MG: /^[0-9]{3}$/,
114+
JP: /^\d{3}(-\d{4})?$/,
115+
KR: /^\d{3}-\d{3}$/,
116+
LV: /^([a-zA-Z]{2}-)?(\d{4})$/,
117+
MT: /^[a-zA-Z]{3}\s\d{2,4}$/,
118+
MV: /^\d{4,5}$/,
119+
NL: /^(\d{4})\s?[a-zA-Z]{2}$/,
120+
PL: /^\d{2}(-)?\d{3}$/,
121+
PT: /^\d{4}(-)?\d{3}$/,
122+
SZ: /^[a-zA-Z]{1}\d{3}$/,
123+
TW: /^\d{3}(\d{2})?$/,
124+
US: /^\d{5}(-\d{4})?$/,
96125
},
97126
headers = [
98127
'countryCode',
@@ -107,23 +136,60 @@ var getZipCode = function (country, zip, callback) {
107136
'latitude',
108137
'longitude',
109138
'accuracy'
110-
];
111-
if (typeof key[country] !== 'undefined') {
112-
var k = key[country] > 0 ? zip.toUpperCase().replace(/[^0-9A-Z]/g, '').substr(0, key[country]) : 0;
113-
window.zipCodesCallback = function (zipCodes) {
114-
var result = {};
115-
if (typeof zipCodes[zip] !== 'undefined') {
116-
for (var i = 0, len = headers.length; i < len; i++) {
117-
result[headers[i]] = zipCodes[zip][i];
118-
}
119-
callback(result);
139+
],
140+
pattern = null,
141+
country = country && country.toLocaleUpperCase();
142+
143+
// Check patterns.
144+
if (typeof patterns[country] !== 'undefined') {
145+
pattern = patterns[country];
146+
}
147+
else {
148+
for (var k in patterns) {
149+
if (patterns.hasOwnProperty(k) && k.indexOf(country) > 0) {
150+
pattern = patterns[k];
151+
break;
120152
}
121-
else {
122-
callback(false);
153+
}
154+
}
155+
var result = {
156+
input: {
157+
country: country,
158+
zip: zip
159+
},
160+
lookup: {},
161+
pattern: pattern,
162+
validPattern: pattern && pattern.test(zip),
163+
validLookup: false,
164+
valid: false
165+
};
166+
167+
// Process lookup if pattern is unmatched or validated.
168+
if (!result.pattern || result.validPattern) {
169+
if (typeof keys[country] !== 'undefined') {
170+
// Remove specificity that is beyond our database.
171+
if (country === 'US' && zip.indexOf('-') === 5) {
172+
zip = zip.substring(0, zip.indexOf('-'));
123173
}
124-
};
125-
var script = document.createElement('script');
126-
script.src = 'https://' + country.toUpperCase() + '.zipcodes.gdn/min/' + k + '.jsonp';
127-
document.body.appendChild(script);
174+
window.zipCodesCallback = function (zipCodes) {
175+
if (typeof zipCodes[zip] !== 'undefined') {
176+
for (var i = 0, len = headers.length; i < len; i++) {
177+
result.lookup[headers[i]] = zipCodes[zip][i];
178+
}
179+
result.validLookup = true;
180+
result.valid = true;
181+
}
182+
callback(result);
183+
};
184+
var k = keys[country] > 0 ? zip.toUpperCase().replace(/[^0-9A-Z]/g, '').substr(0, keys[country]) : 0,
185+
script = document.createElement('script');
186+
script.src = 'https://' + country + '.zipcodes.gdn/min/' + k + '.jsonp';
187+
document.body.appendChild(script);
188+
}
189+
else {
190+
// Unable to lookup and/or pattern match.
191+
result.valid = true;
192+
callback(result);
193+
}
128194
}
129195
};

0 commit comments

Comments
 (0)