Contrôle de codes postaux internationaux
Le code Javascript qui suit, permet de vérifier à la saisie que le format du code postal correspond au format officiel du pays de destination. Les pays pris en compte pour l'exemple sont la France, Pays Bas, États Unis, Royaume Uni, Belgique et Australie.
- Compatibilité devices mobile/desktop
- Contrôle du pattern à la saisie et indicateur visuel
- Automatisation (ajout d'un simple attribut)
- Evolution des patterns facilitée
- Pattern par défaut personnalisable
- Nécessite JQuery
nb : vous devez créer une classe CSS personnelle .error
ou utiliser celle disponible dans les sources du site voir la feuille de styles
Comment ajouter un pattern de contrôle ?
[…]
 'us': { // clé pays
 'type': 'text', /* type d'input de saisie (text, number) */
 'length': null, /* maxlength */
 'regex': /^[0-9]{5}(?:(-| )[0-9]{4})?$/ /* le pattern autorisé */
 }
[…]
Plus d'informations sur les formats des codes postaux par pays.
Fonction jQuery.fn.zipcode
/*
 * Copyright © 2006 2024. Kortic (URL : https://www.kortic.com/script-de-controle-de-format-de-codes-postaux-internationaux.html)
 * licence Creative Commons CC BY-NC-SA 4.0
 * https://creativecommons.org/licenses/by-nc-sa/4.0/deed.fr
 */
 
;(function (__) {
 'use strict';
 __.fn.zipcode = function(opts) {
 let settings = __.extend({
 'attribute': 'data-zipcode',
 'maxlength' : 10,
 'useLocale': false,
 'sendpattern': false
 }, opts),
 patterns = {
 'default': { // 5 digits type number
 'type': 'text',
 'length': 5,
 'regex': /^[0-9]{5}$/
 },
 'nl': {
 'type': 'text',
 'length': 10,
 'regex': /^(?:NL-)?(?:[1-9][0-9]{3} ?(?:[A-EGHJ-NPRTVWXZ][A-EGHJ-NPRSTVWXZ]|S[BCEGHJ-NPRTVWXZ]))$/i
 },
 'be': {
 'type': 'text',
 'length': 4,
 'regex': /^[0-9]{4}$/
 },
 'au': {
 'type': 'text',
 'length': 4,
 'regex': /^[0-9]{4}$/
 },
 'uk': {
 'type': 'text',
 'length': 8,
 'regex': /((?:(?:gir)|(?:[a-pr-uwyz])(?:(?:[0-9](?:[a-hjkpstuw]|[0-9])?)|(?:[a-hk-y][0-9](?:[0-9]|[abehmnprv-y])?)))) ?([0-9][abd-hjlnp-uw-z]{2})/
 },
 'us': {
 'type': 'text',
 'length': null,
 'regex': /^[0-9]{5}(?:(-| )[0-9]{4})?$/
 },
 'lu': {
 'type': 'text',
 'length': null,
 'regex': /^((L)[\-])?(\d{4})$/
 }
 /* add regex… */
 };
 __(this).each(function() {
 let element_ = __(this),
 key = settings.useLocale === false ? ( element_.attr(settings.attribute).length ? element_.attr(settings.attribute).toLowerCase() : 'default') : settings.useLocale.toLowerCase(),
 pattern = patterns[ __.array_key_exists(key, patterns) ? key : 'default' ];
 element_.attr({
 'type': pattern.type,
 'maxlength': pattern.type !== 'number' ? (pattern.length !== null ? pattern.length : settings.maxlength) : null
 });
 if(pattern.type === 'number') {
 element_.data('count', 0).attr({
 'min': 0,
 'max': '9'.repeat(pattern.length),
 'step': 1000
 });
 }
 // envoyer la regExp au back pour contrôle
 if(settings.sendpattern) {
 let inputPattern = __('<input/>', {
 'type': 'hidden',
 'value': pattern.regex,
 'name': 'pattern'
 });
 element_.parents('form').append(inputPattern);
 }
 element_.on({
 input: () => {
 element_.removeClass('error');
 let reg = new RegExp( pattern.regex, 'ig');
 if(element_.val().length) {
 if(!reg.test(element_.val())){
 element_.addClass('error');
 }
 }
 }
 });
 return this;
 });
 };
 __(document).ready( function() {
 // appel générique pour les champs avec attribut data-zipcode
 __('[data-zipcode]').zipcode({
 'sendpattern': true // ajoute un champ caché dans le formulaire parent du champ pour envoyer la RegExp pour traitement back
 });
 /*
 **
 ***
 appel pour les champs avec attribut data-specific et/ou variable locale définie
 __('[data-specific]').zipcode({
 'attribute': 'data-specific',
 'useLocale': 'fr' // ou variable js globale
 });
 ***
 **
 */
 });
})(jQuery);
Liste d'expressions régulières par pays
Pour étendre la fonction principale, une liste non exhaustive au format CSV avec séparateur point-virgule.
Country;Country ISO code;Regex;Sample
Andorra;AD;AD\d{3};AD100
United Arab Emirates;AE;;
Afghanistan;AF;\d{4};1057
Antigua and Barbuda;AG;;33901
Anguilla;AI;(AI-2640);AI-2640
Albania;AL;\d{4};5300
Armenia;AM;(\d{4})|(\d{6});0010, 001011
Angola;AO;;
Antarctica;AQ;(7151);7151
Argentina;AR;([A-Z]\d{4}[A-Z]{3})|([A-Z]\d{4});C1425CLA, U9000
American Samoa;AS;967\d{2}(-\d{4})?;96799, 96799-9999
Austria;AT;\d{4};1010
Australia;AU;\d{4};2599
Aruba;AW;;
Azerbaijan;AZ;(AZ)(\d{4})|(AZ )(\d{4});AZ 1000, AZ1000
Bosnia and Herzegovina;BA;\d{5};71000
Barbados;BB;BB\d{5};BB15094
Bangladesh;BD;\d{4};1219
Belgium;BE;\d{4};1049
Burkina Faso;BF;[1-9]\d{4};99999
Bulgaria;BG;\d{4};1000
Bahrain;BH;\d{3}\d?;317, 1216
Burundi;BI;;
Benin;BJ;;
Bermuda;BM;[A-Z]{2} \d{2};CR 03
Brunei Darussalam;BN;[A-Z]{2}\d{4};KB2333
Bolivia;BO;;
Bonaire, Sint Eustatius and Saba;BQ;;
Brazil;BR;[0-9]{5}-[0-9]{3};28999-999
Bahamas;BS;;
Bhutan;BT;\d{5};31002
Bouvet Island;BV;;
Botswana;BW;;
Belarus;BY;\d{6};231300
Belize;BZ;;
Canada;CA;[A-Z][0-9][A-Z] [0-9][A-Z][0-9];K1A 0T6
Cocos (Keeling) Islands;CC;(6799);6799
Congo, the Democratic Republic of the;CD;;
Central African Republic;CF;;
Congo;CG;;
Switzerland;CH;[1-9]\d{3};8050
Côte d'Ivoire;CI;;
Cook Islands;CK;;
Chile;CL;\d{7};9340000
Cameroon;CM;;
China;CN;\d{6};710000
Colombia;CO;\d{6};111121
Costa Rica;CR;\d{5};10101
Cuba;CU;(CP)?\d{5};CP10400
Cabo Verde;CV;\d{4};5110
Curaçao;CW;;
Christmas Island;CX;(6798);6798
Cyprus;CY;[1-9]\d{3};4999
Czech Republic;CZ;[1-7][0-9]{2} [0-9]{2}|[1-7][0-9]{4};160 00, 16000
Germany;DE;\d{5};60320
Djibouti;DJ;;
Denmark;DK;\d{4};2000
Dominica;DM;;
Dominican Republic;DO;\d{5};10103
Algeria;DZ;\d{5};16000
Ecuador;EC;\d{6};170515
Estonia;EE;\d{5};10111
Egypt;EG;\d{5};12411
Eritrea;ER;;
Spain;ES;\d{5};28006
Ethiopia;ET;\d{4};3020
Finland;FI;\d{5};00180
Fiji;FJ;;
Falkland Islands (Malvinas);FK;(FIQQ 1ZZ);FIQQ 1ZZ
Micronesia, Federated States of;FM;9694\d{1}(-\d{4})?;96942, 96942-9999
Faroe Islands;FO;\d{3};927
France;FR;\d{5};75008
Gabon;GA;;
United Kingdom of Great Britain and Northern Ireland (the);GB;([G][I][R] 0[A]{2})|((([A-Z][0-9]{1,2})|(([A-Z][A-HJ-Y][0-9]{1,2})|(([A-Z][0-9][A-Z])|([A-Z][A-HJ-Y][0-9]?[A-Z])))) [0-9][A-Z]{2});DT3 6GB, L2 2DP
Grenada;GD;;
Georgia;GE;\d{4};0100
Guernsey;GG;(GY)([0-9][0-9A-HJKPS-UW]?|[A-HK-Y][0-9][0-9ABEHMNPRV-Y]?) [0-9][ABD-HJLNP-UW-Z]{2};GY1 3HR
Ghana;GH;;
Gibraltar;GI;(GX11 1AA);GX11 1AA
Greenland;GL;39\d{2};3905
Gambia;GM;;
Guinea;GN;\d{3};001
Equatorial Guinea;GQ;;
Greece;GR;(\d{3}) \d{2}|\d{5};241 00, 24100
South Georgia and the South Sandwich Islands;GS;(SIQQ 1ZZ);SIQQ 1ZZ
Guatemala;GT;\d{5};01002
Guam;GU;((969)[1-3][0-2])(-\d{4})?;96911, 96911-9999
Guinea-Bissau;GW;\d{4};1000
Guyana;GY;;
Hong Kong;HK;(999077);999077
Heard Island and McDonald Islands;HM;(7151);7151
Honduras;HN;\d{5};34101
Croatia;HR;[1-5]\d{4};21000
Haiti;HT;(HT)(\d{4})|(HT) (\d{4});HT1440, HT 1440
Hungary;HU;[1-9]\d{3};2310
Indonesia;ID;[1-9]\d{4};15360
Ireland;IE;;
Israel;IL;\d{7};1029200
Isle of Man;IM;(IM)([0-9][0-9A-HJKPS-UW]?|[A-HK-Y][0-9][0-9ABEHMNPRV-Y]?) [0-9][ABD-HJLNP-UW-Z]{2};IM5 1JS
India;IN;[1-9]\d{5};500012
British Indian Ocean Territory;IO;(BB9D 1ZZ);BB9D 1ZZ
Iraq;IQ;\d{5};58019
Iran, Islamic Republic of;IR;\d{5}[\-]?\d{5};9187158198, 15119-43943
Iceland;IS;[1-9]\d{2};101
Italy;IT;\d{5};36051
Jersey;JE;JE[0-9]{1}[\s]([\d][A-Z]{2});JE1 1AG
Jamaica;JM;(JM)[A-Z]{3}\d{2};JMAAW19
Jordan;JO;\d{5};11118
Japan;JP;(\d{3}-\d{4});408-0307
Kenya;KE;\d{5};40406
Kyrgyzstan;KG;\d{6};720020
Cambodia;KH;\d{5,6};01501, 010102, 120209
Kiribati;KI;KI\d{4};KI0107
Comoros;KM;;
Saint Kitts and Nevis;KN;KN\d{4}(\-\d{4})?;KN0101, KN0802, KN0801-0802, KN0901-0902
Korea, Democratic People's Republic of;KP;;
Korea, Republic of;KR;\d{5};11962
Kuwait;KW;\d{5};60000
Cayman Islands;KY;[K][Y][0-9]{1}[-]([0-9]){4};KY1-1800
Kazakhstan;KZ;([A-Z]\d{2}[A-Z]\d[A-Z]\d)|(\d{6});A10A5T4, 010010
Lao People's Democratic Republic;LA;\d{5};13000
Lebanon;LB;\d{4}( \d{4})?;2038 3054, 1103
Saint Lucia;LC;LC\d{2} \d{3};LC05 201
Liechtenstein;LI;\d{4};9490
Sri Lanka;LK;\d{5};80212
Liberia;LR;\d{4};1000
Lesotho;LS;\d{3};100
Lithuania;LT;((LT)[\-])?(\d{5});LT-01100, 01100
Luxembourg;LU;((L)[\-])?(\d{4});1019, L-2530
Latvia;LV;((LV)[\-])?(\d{4});LV-1010, 1010
Libya;LY;;13.05.312
Morocco;MA;[1-9]\d{4};20192
Moldova, Republic of;MD;(MD[\-]?)?(\d{4});MD2001, MD-2001, 2001
Montenegro;ME;\d{5};81250
Madagascar;MG;\d{3};101
Marshall Islands;MH;((969)[6-7][0-9])(-\d{4})?;96960, 96960-9999
North Macedonia;MK;\d{4};1045
Mali;ML;;
Myanmar;MM;\d{5};11121
Mongolia;MN;\d{5};16080
Macao;MO;;999078
Northern Mariana Islands;MP;9695\d{1}(-\d{4})?;96950, 96950-9999
Mauritania;MR;;
Montserrat;MS;MSR\d{4};MSR1120
Malta;MT;[A-Z]{3} [0-9]{4}|[A-Z]{2}[0-9]{2}|[A-Z]{2} [0-9]{2}|[A-Z]{3}[0-9]{4}|[A-Z]{3}[0-9]{2}|[A-Z]{3} [0-9]{2};VLT 1117, TP01, TP 01, RBT1676, QRM09, BKR 01
Mauritius;MU;([0-9A-R]\d{4});A0000, 20101
Maldives;MV;\d{5};20195
Malawi;MW;\d{6};101100, 307100
Mexico;MX;\d{5};97229
Malaysia;MY;\d{5};50050
Mozambique;MZ;\d{4};1104
Namibia;NA;\d{5};10003
New Caledonia;NC;988\d{2};98814
Niger;NE;\d{4};8001
Norfolk Island;NF;(2899);2899
Nigeria;NG;[1-9]\d{5};100001
Nicaragua;NI;\d{5};11001
Netherlands;NL;[1-9]\d{3} [A-Z]{2}|[1-9]\d{3}[A-Z]{2};1011 AC, 1011AC
Norway;NO;\d{4};5262
Nepal;NP;\d{5};44600
Nauru;NR;(NRU68);NRU68
Niue;NU;(9974);9974
New Zealand;NZ;\d{4};8041
Oman;OM;\d{3};112
Panama;PA;\d{4};0601, 1001
Peru;PE;\d{5};15001
French Polynesia;PF;((987)\d{2});98755
Papua New Guinea;PG;\d{3};244
Philippines;PH;\d{4};4104
Pakistan;PK;[1-9]\d{4};75600
Poland;PL;[0-9]{2}[-]([0-9]){3};87-100
Pitcairn;PN;(PCR9 1ZZ);PCR9 1ZZ
Palestine, State of;PS;(P[1-9]\d{6})|(\d{3}-\d{3});600-699, P3600700
Portugal;PT;[1-9]\d{3}((-)\d{3});1000-260
Palau;PW;(96939|96940); 96939, 96940
Paraguay;PY;\d{4};3180
Qatar;QA;;
Romania;RO;\d{6};507085
Serbia;RS;\d{5,6};24430, 456769
Russian Federation;RU;\d{6};385100
Rwanda;RW;;
Saudi Arabia;SA;[1-8]\d{4}([\-]\d{4})?;11564, 75311-8538
Solomon Islands;SB;;
Seychelles;SC;;
Sudan;SD;\d{5};13315
Sweden;SE;[1-9]\d{2} \d{2};113 51
Singapore;SG;\d{6};570150
Saint Helena, Ascension and Tristan da Cunha;SH;(ASCN 1ZZ|TDCU 1ZZ|STHL 1ZZ);ASCN 1ZZ, TDCU 1ZZ, STHL 1ZZ
Slovenia;SI;[1-9]\d{3};8341
Slovakia;SK;(\d{3} \d{2})|\d{5};811 01, 81101
Sierra Leone;SL;;
San Marino;SM;(4789\d);47894
Senegal;SN;[1-8]\d{4};10200
Somalia;SO;;
Suriname;SR;;
South Sudan;SS;\d{5};11111
São Tomé and Principe;ST;;
El Salvador;SV;\d{4};1201
Sint Maarten (Dutch part);SX;;
Syrian Arab Republic;SY;;
Swaziland;SZ;([A-Z]\d{3});M201
Turks and Caicos Islands;TC;(TKCA 1ZZ);TKCA 1ZZ
Chad;TD;;
French Southern Territories;TF;;
Togo;TG;;
Thailand;TH;\d{5};10240
Tajikistan;TJ;7\d{5};799999
Tokelau;TK;;
Timor-Leste;TL;;
Turkmenistan;TM;7\d{5};745180
Tunisia;TN;\d{4};3200
Tonga;TO;;
Turkey;TR;\d{5};34000
Trinidad and Tobago;TT;\d{6};120110
Tuvalu;TV;;
Taiwan (Province of China);TW;(\d{3}\-\d{3})|(\d{3}[-]\d{2})|(\d{6})|(\d{3});237-01, 407, 999999, 999(-)999
Tanzania, United Republic of;TZ;\d{5};31324
Ukraine;UA;\d{5};65000
Uganda;UG;;
United States Minor Outlying Islands;UM;;
United States of America;US;\d{5}(-\d{4})?;11550, 11550-9999, 00716, 00716-9999
Uruguay;UY;[1-9]\d{4};11700
Uzbekistan;UZ;\d{6};702100
Holy See;VA;(00120);00120
Saint Vincent and the Grenadines;VC;(VC)(\d{4});VC0100
Venezuela (Bolivarian Republic of);VE;[1-8]\d{3};1061
Virgin Islands (British);VG;(VG11)[0-6][0];VG1120
Virgin Islands (U.S.);VI;008\d{2}(-\d{4})?;00850, 00850-9999
Viet Nam;VN;\d{6};112132
Vanuatu;VU;;
Wallis and Futuna;WF;(986)\d{2};98600
Samoa;WS;WS[1-2]\d{3};WS1382
Yemen;YE;;
South Africa;ZA;\d{4};6001
Zambia;ZM;\d{5};50100
Zimbabwe;ZW;;
Vous aimez cette page ?
Dites-le !
Utilisation des sources
Les sources proposées sur Kortic Anthony Ladeuil sont mises à disposition selon les termes suivants :
Licence Creative commons CC BY-NC-SA 4.0
- Attribution
-
Détails
Vous devez créditer l'Œuvre, intégrer un lien vers la licence et indiquer si des modifications ont été effectuées à l'Oeuvre. Vous devez indiquer ces informations par tous les moyens raisonnables, sans toutefois suggérer que l'Offrant vous soutient ou soutient la façon dont vous avez utilisé son Oeuvre.
- Pas d’utilisation commerciale
-
Détails
Vous n'êtes pas autorisé à faire un usage commercial de cette Oeuvre, tout ou partie du matériel la composant.
Bien entendu, la probabilité est faible pour que ce point soit respecté. En cas de sursaut d'honnêteté, vous pouvez payer un café, cette page soulagera votre conscience. - Partage dans les mêmes conditions
-
Détails
Dans le cas où vous effectuez un remix, que vous transformez, ou créez à partir du matériel composant l'Oeuvre originale, vous devez diffuser l'Oeuvre modifiée dans les même conditions, c'est à dire avec la même licence avec laquelle l'Oeuvre originale a été diffusée.
À défaut de tout ça, un petit message et une référence à ce site restent les bienvenus.
Limitation de responsabilité
Le code est fourni « tel quel », sans garantie d'aucune sorte, expresse ou implicite. En aucun cas l’auteur ou les détenteurs du copyright ne seront responsables de toute réclamation, dommage ou autre responsabilité, que ce soit dans une action contractuelle, délictuelle ou autre, résultant de, en dehors ou en relation avec le logiciel ou l'utilisation ou d'autres transactions.