PluginProbe
FluentCart A New Era of eCommerce – Faster, Lighter, and Simpler / 1.6.4
FluentCart A New Era of eCommerce – Faster, Lighter, and Simpler v1.6.4
1.6.4 1.6.3 1.6.2 1.6.1 1.6.0 1.5.4 1.5.5 1.5.3 1.5.2 1.5.1 1.5.0 1.4.2 1.4.1 1.4.0 1.3.28 1.3.27 1.3.26 1.3.25 1.3.23 1.3.22 1.3.21 1.3.20 1.3.19 trunk 1.2.0 All 47 releases
fluent-cart / app / Services / Localization / PostcodeVerification.php

PostcodeVerification.php in FluentCart A New Era of eCommerce – Faster, Lighter, and Simpler 1.6.4, at app/Services/Localization/PostcodeVerification.php

206 lines 6.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace FluentCart\App\Services\Localization;
4
5 class PostcodeVerification
6 {
7 public function formatPostcode($postcode, $country)
8 {
9 $postcode = $this->normalizePostcode($postcode ?? '');
10
11 switch ($country) {
12 case 'SE':
13 $postcode = substr_replace($postcode, ' ', -2, 0);
14 break;
15 case 'CA':
16 case 'GB':
17 $postcode = substr_replace($postcode, ' ', -3, 0);
18 break;
19 case 'IE':
20 $postcode = substr_replace($postcode, ' ', 3, 0);
21 break;
22 case 'BR':
23 case 'PL':
24 $postcode = substr_replace($postcode, '-', -3, 0);
25 break;
26 case 'JP':
27 $postcode = substr_replace($postcode, '-', 3, 0);
28 break;
29 case 'PT':
30 $postcode = substr_replace($postcode, '-', 4, 0);
31 break;
32 case 'PR':
33 case 'US':
34 case 'MN':
35 $postcode = rtrim(substr_replace($postcode, '-', 5, 0), '-');
36 break;
37 case 'NL':
38 $postcode = substr_replace($postcode, ' ', 4, 0);
39 break;
40 case 'LV':
41 $postcode = preg_replace('/^(LV)?-?(\d+)$/', 'LV-${2}', $postcode);
42 break;
43 case 'CZ':
44 case 'SK':
45 $postcode = preg_replace("/^({$country})-?(\d+)$/", '${1}-${2}', $postcode);
46 $postcode = substr_replace($postcode, ' ', -2, 0);
47 break;
48 case 'DK':
49 $postcode = preg_replace('/^(DK)(.+)$/', '${1}-${2}', $postcode);
50 break;
51 }
52
53 return apply_filters('fluent_cart/address/postcode/format', trim($postcode), $country);
54 }
55
56 /**
57 * Normalize postcodes.
58 *
59 * Remove spaces and convert characters to uppercase.
60 *
61 * @param string $postcode Postcode.
62 * @return string
63 */
64 public function normalizePostcode($postcode)
65 {
66 return preg_replace('/[\s\-]/', '', trim(self::fctStrtoupper($postcode ?? '')));
67 }
68
69 public static function fctStrtoupper( $string )
70 {
71 $string = $string ?? '';
72 return function_exists( 'mb_strtoupper' ) ? mb_strtoupper( $string ) : strtoupper( $string );
73 }
74
75
76 public function isValid($postcode, $country)
77 {
78 if (strlen(trim(preg_replace('/[\s\-A-Za-z0-9]/', '', $postcode))) > 0) {
79 return false;
80 }
81
82 switch ($country) {
83 case 'AT':
84 case 'BE':
85 case 'CH':
86 case 'HU':
87 case 'NO':
88 $valid = (bool) preg_match('/^([0-9]{4})$/', $postcode);
89 break;
90 case 'BA':
91 $valid = (bool) preg_match('/^([7-8]{1})([0-9]{4})$/', $postcode);
92 break;
93 case 'BR':
94 $valid = (bool) preg_match('/^([0-9]{5})([-])?([0-9]{3})$/', $postcode);
95 break;
96 case 'DE':
97 $valid = (bool) preg_match('/^([0]{1}[1-9]{1}|[1-9]{1}[0-9]{1})[0-9]{3}$/', $postcode);
98 break;
99 case 'DK':
100 $valid = (bool) preg_match('/^(DK-)?([1-24-9]\d{3}|3[0-8]\d{2})$/', $postcode);
101 break;
102 case 'ES':
103 case 'FI':
104 case 'EE':
105 case 'FR':
106 case 'IT':
107 $valid = (bool) preg_match('/^([0-9]{5})$/i', $postcode);
108 break;
109 case 'GB':
110 $valid = self::isGBPostcode($postcode);
111 break;
112 case 'IE':
113 $valid = (bool) preg_match('/([AC-FHKNPRTV-Y]\d{2}|D6W)[0-9AC-FHKNPRTV-Y]{4}/', $this->normalizePostcode($postcode));
114 break;
115 case 'IN':
116 $valid = (bool) preg_match('/^[1-9]{1}[0-9]{2}\s{0,1}[0-9]{3}$/', $postcode);
117 break;
118 case 'JP':
119 $valid = (bool) preg_match('/^([0-9]{3})([-]?)([0-9]{4})$/', $postcode);
120 break;
121 case 'PT':
122 $valid = (bool) preg_match('/^([0-9]{4})([-])([0-9]{3})$/', $postcode);
123 break;
124 case 'PR':
125 case 'US':
126 $valid = (bool) preg_match('/^([0-9]{5})(-[0-9]{4})?$/i', $postcode);
127 break;
128 case 'CA':
129 // CA Postal codes cannot contain D,F,I,O,Q,U and cannot start with W or Z. https://en.wikipedia.org/wiki/Postal_codes_in_Canada#Number_of_possible_postal_codes.
130 $valid = (bool) preg_match('/^([ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ])([\ ])?(\d[ABCEGHJKLMNPRSTVWXYZ]\d)$/i', $postcode);
131 break;
132 case 'PL':
133 $valid = (bool) preg_match('/^([0-9]{2})([-])([0-9]{3})$/', $postcode);
134 break;
135 case 'CZ':
136 case 'SE':
137 case 'SK':
138 $valid = (bool) preg_match("/^($country-)?([0-9]{3})(\s?)([0-9]{2})$/", $postcode);
139 break;
140 case 'NL':
141 $valid = (bool) preg_match('/^([1-9][0-9]{3})(\s?)(?!SA|SD|SS)[A-Z]{2}$/i', $postcode);
142 break;
143 case 'SI':
144 $valid = (bool) preg_match('/^([1-9][0-9]{3})$/', $postcode);
145 break;
146 case 'LI':
147 $valid = (bool) preg_match('/^(94[8-9][0-9])$/', $postcode);
148 break;
149 default:
150 $valid = true;
151 break;
152 }
153
154 return apply_filters('fluent_cart/address/postcode/is_valid', $valid, $postcode, $country);
155 }
156
157 public static function isGBPostcode( $to_check ) {
158
159 // Permitted letters depend upon their position in the postcode.
160 // https://en.wikipedia.org/wiki/Postcodes_in_the_United_Kingdom#Validation.
161 $alpha1 = '[abcdefghijklmnoprstuwyz]'; // Character 1.
162 $alpha2 = '[abcdefghklmnopqrstuvwxy]'; // Character 2.
163 $alpha3 = '[abcdefghjkpstuw]'; // Character 3 == ABCDEFGHJKPSTUW.
164 $alpha4 = '[abehmnprvwxy]'; // Character 4 == ABEHMNPRVWXY.
165 $alpha5 = '[abdefghjlnpqrstuwxyz]'; // Character 5 != CIKMOV.
166
167 $pcexp = array();
168
169 // Expression for postcodes: AN NAA, ANN NAA, AAN NAA, and AANN NAA.
170 $pcexp[0] = '/^(' . $alpha1 . '{1}' . $alpha2 . '{0,1}[0-9]{1,2})([0-9]{1}' . $alpha5 . '{2})$/';
171
172 // Expression for postcodes: ANA NAA.
173 $pcexp[1] = '/^(' . $alpha1 . '{1}[0-9]{1}' . $alpha3 . '{1})([0-9]{1}' . $alpha5 . '{2})$/';
174
175 // Expression for postcodes: AANA NAA.
176 $pcexp[2] = '/^(' . $alpha1 . '{1}' . $alpha2 . '[0-9]{1}' . $alpha4 . ')([0-9]{1}' . $alpha5 . '{2})$/';
177
178 // Exception for the special postcode GIR 0AA.
179 $pcexp[3] = '/^(gir)(0aa)$/';
180
181 // Standard BFPO numbers.
182 $pcexp[4] = '/^(bfpo)([0-9]{1,4})$/';
183
184 // c/o BFPO numbers.
185 $pcexp[5] = '/^(bfpo)(c\/o[0-9]{1,3})$/';
186
187 // Load up the string to check, converting into lowercase and removing spaces.
188 $postcode = strtolower( $to_check );
189 $postcode = str_replace( ' ', '', $postcode );
190
191 // Assume we are not going to find a valid postcode.
192 $valid = false;
193
194 // Check the string against the six types of postcodes.
195 foreach ( $pcexp as $regexp ) {
196 if ( preg_match( $regexp, $postcode, $matches ) ) {
197 // Remember that we have found that the code is valid and break from loop.
198 $valid = true;
199 break;
200 }
201 }
202
203 return $valid;
204 }
205 }
206