Quel est le code postal ultime et l'expression régulière zip?


201

Je recherche le code postal et l'expression rationnelle ultimes. Je cherche quelque chose qui couvrira la plupart (espérons-le tout) du monde.


4
Une seule expression régulière pour tous les codes postaux serait inutile dans la plupart des cas, sans compter qu'elle nécessite beaucoup d'encodage Unicode. Il vaut mieux vérifier les expressions régulières pays par pays afin de ne pas valider des choses comme "New York, NY AF23Q" comme étant correctes.
Oui - ce Jake.

101
Vous avez un problème. Vous écrivez un regex pour cela. Vous avez maintenant deux problèmes.
Robert


2
Celui qui gère toutes les valeurs futures possibles.
Jodrell

Réponses:


127

Il n'y en a pas.

Les codes postaux / zip dans le monde ne suivent pas un schéma commun. Dans certains pays, ils sont constitués de chiffres, dans d'autres ils peuvent être des combinaisons de chiffres et de lettres, certains peuvent contenir des espaces, d'autres des points, le nombre de caractères peut varier de deux à au moins six ...

Ce que vous pourriez faire (théoriquement), c'est créer un regex séparé pour chaque pays dans le monde, non recommandé par l'OMI. Mais vous seriez toujours absent sur la partie validation: le code postal 12345peut exister, mais 12346non, il 12344n'existe peut - être pas non plus. Comment vérifiez-vous cela avec une expression régulière?

Tu ne peux pas.


Je soupçonne qu'une expression régulière pourrait être compilée, mais qu'une tâche comme celle-ci conviendrait beaucoup mieux à une base de données. Le regex ressemblerait à quelque chose comme 10000 | 10001 | 10002 | 10003 | .......
Kibbee

pour valider un champ, rendez-vous ici regexlib.com/Search.aspx?k=decimal&c=3&m=-1&ps=100
Dinesh Kumar

Vous pouvez d'abord utiliser une expression rationnelle qui correspond à votre pays (voir en.wikipedia.org/wiki/List_of_postal_codes ) et faire une véritable vérification par un service externe comme geonames.org/export/ws-overview.html
SimonSimCity

3
Mes deux cents: au Brésil, il s'agit en fait de 8 chiffres, 5 suivis d'un tiret et 3 de plus
Jorge Campos

^\d{5}(?:[-\s]\d{4})?$
Aamir Afridi

261

Le CLDR unicode contient l'expression régulière du code postal pour chaque pays. (158 regex au total!)

Google a également un service Web avec des informations de formatage par pays, y compris les codes postaux, ici - http://i18napis.appspot.com/address (j'ai trouvé ce lien via http://unicode.org/review/pri180/ )

Éditer

Voici une copie de l' expression régulière postalCodeData.xml :

"GB", "GIR[ ]?0AA|((AB|AL|B|BA|BB|BD|BH|BL|BN|BR|BS|BT|CA|CB|CF|CH|CM|CO|CR|CT|CV|CW|DA|DD|DE|DG|DH|DL|DN|DT|DY|E|EC|EH|EN|EX|FK|FY|G|GL|GY|GU|HA|HD|HG|HP|HR|HS|HU|HX|IG|IM|IP|IV|JE|KA|KT|KW|KY|L|LA|LD|LE|LL|LN|LS|LU|M|ME|MK|ML|N|NE|NG|NN|NP|NR|NW|OL|OX|PA|PE|PH|PL|PO|PR|RG|RH|RM|S|SA|SE|SG|SK|SL|SM|SN|SO|SP|SR|SS|ST|SW|SY|TA|TD|TF|TN|TQ|TR|TS|TW|UB|W|WA|WC|WD|WF|WN|WR|WS|WV|YO|ZE)(\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2}))|BFPO[ ]?\d{1,4}"
"JE", "JE\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2}"
"GG", "GY\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2}"
"IM", "IM\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2}"
"US", "\d{5}([ \-]\d{4})?"
"CA", "[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJ-NPRSTV-Z][ ]?\d[ABCEGHJ-NPRSTV-Z]\d"
"DE", "\d{5}"
"JP", "\d{3}-\d{4}"
"FR", "\d{2}[ ]?\d{3}"
"AU", "\d{4}"
"IT", "\d{5}"
"CH", "\d{4}"
"AT", "\d{4}"
"ES", "\d{5}"
"NL", "\d{4}[ ]?[A-Z]{2}"
"BE", "\d{4}"
"DK", "\d{4}"
"SE", "\d{3}[ ]?\d{2}"
"NO", "\d{4}"
"BR", "\d{5}[\-]?\d{3}"
"PT", "\d{4}([\-]\d{3})?"
"FI", "\d{5}"
"AX", "22\d{3}"
"KR", "\d{3}[\-]\d{3}"
"CN", "\d{6}"
"TW", "\d{3}(\d{2})?"
"SG", "\d{6}"
"DZ", "\d{5}"
"AD", "AD\d{3}"
"AR", "([A-HJ-NP-Z])?\d{4}([A-Z]{3})?"
"AM", "(37)?\d{4}"
"AZ", "\d{4}"
"BH", "((1[0-2]|[2-9])\d{2})?"
"BD", "\d{4}"
"BB", "(BB\d{5})?"
"BY", "\d{6}"
"BM", "[A-Z]{2}[ ]?[A-Z0-9]{2}"
"BA", "\d{5}"
"IO", "BBND 1ZZ"
"BN", "[A-Z]{2}[ ]?\d{4}"
"BG", "\d{4}"
"KH", "\d{5}"
"CV", "\d{4}"
"CL", "\d{7}"
"CR", "\d{4,5}|\d{3}-\d{4}"
"HR", "\d{5}"
"CY", "\d{4}"
"CZ", "\d{3}[ ]?\d{2}"
"DO", "\d{5}"
"EC", "([A-Z]\d{4}[A-Z]|(?:[A-Z]{2})?\d{6})?"
"EG", "\d{5}"
"EE", "\d{5}"
"FO", "\d{3}"
"GE", "\d{4}"
"GR", "\d{3}[ ]?\d{2}"
"GL", "39\d{2}"
"GT", "\d{5}"
"HT", "\d{4}"
"HN", "(?:\d{5})?"
"HU", "\d{4}"
"IS", "\d{3}"
"IN", "\d{6}"
"ID", "\d{5}"
"IL", "\d{5}"
"JO", "\d{5}"
"KZ", "\d{6}"
"KE", "\d{5}"
"KW", "\d{5}"
"LA", "\d{5}"
"LV", "\d{4}"
"LB", "(\d{4}([ ]?\d{4})?)?"
"LI", "(948[5-9])|(949[0-7])"
"LT", "\d{5}"
"LU", "\d{4}"
"MK", "\d{4}"
"MY", "\d{5}"
"MV", "\d{5}"
"MT", "[A-Z]{3}[ ]?\d{2,4}"
"MU", "(\d{3}[A-Z]{2}\d{3})?"
"MX", "\d{5}"
"MD", "\d{4}"
"MC", "980\d{2}"
"MA", "\d{5}"
"NP", "\d{5}"
"NZ", "\d{4}"
"NI", "((\d{4}-)?\d{3}-\d{3}(-\d{1})?)?"
"NG", "(\d{6})?"
"OM", "(PC )?\d{3}"
"PK", "\d{5}"
"PY", "\d{4}"
"PH", "\d{4}"
"PL", "\d{2}-\d{3}"
"PR", "00[679]\d{2}([ \-]\d{4})?"
"RO", "\d{6}"
"RU", "\d{6}"
"SM", "4789\d"
"SA", "\d{5}"
"SN", "\d{5}"
"SK", "\d{3}[ ]?\d{2}"
"SI", "\d{4}"
"ZA", "\d{4}"
"LK", "\d{5}"
"TJ", "\d{6}"
"TH", "\d{5}"
"TN", "\d{4}"
"TR", "\d{5}"
"TM", "\d{6}"
"UA", "\d{5}"
"UY", "\d{5}"
"UZ", "\d{6}"
"VA", "00120"
"VE", "\d{4}"
"ZM", "\d{5}"
"AS", "96799"
"CC", "6799"
"CK", "\d{4}"
"RS", "\d{6}"
"ME", "8\d{4}"
"CS", "\d{5}"
"YU", "\d{5}"
"CX", "6798"
"ET", "\d{4}"
"FK", "FIQQ 1ZZ"
"NF", "2899"
"FM", "(9694[1-4])([ \-]\d{4})?"
"GF", "9[78]3\d{2}"
"GN", "\d{3}"
"GP", "9[78][01]\d{2}"
"GS", "SIQQ 1ZZ"
"GU", "969[123]\d([ \-]\d{4})?"
"GW", "\d{4}"
"HM", "\d{4}"
"IQ", "\d{5}"
"KG", "\d{6}"
"LR", "\d{4}"
"LS", "\d{3}"
"MG", "\d{3}"
"MH", "969[67]\d([ \-]\d{4})?"
"MN", "\d{6}"
"MP", "9695[012]([ \-]\d{4})?"
"MQ", "9[78]2\d{2}"
"NC", "988\d{2}"
"NE", "\d{4}"
"VI", "008(([0-4]\d)|(5[01]))([ \-]\d{4})?"
"PF", "987\d{2}"
"PG", "\d{3}"
"PM", "9[78]5\d{2}"
"PN", "PCRN 1ZZ"
"PW", "96940"
"RE", "9[78]4\d{2}"
"SH", "(ASCN|STHL) 1ZZ"
"SJ", "\d{4}"
"SO", "\d{5}"
"SZ", "[HLMS]\d{3}"
"TC", "TKCA 1ZZ"
"WF", "986\d{2}"
"XK", "\d{5}"
"YT", "976\d{2}"

3
Juste avec une analyse rapide de la regex de code postal AU ... cette regex est très simple et permettra à beaucoup de faux positifs de passer, donc ce n'est pas exhaustif.
Taryn East

7
La dernière version du CLDR unicode contenant l'expression régulière du code postal est la version 26.0.1. Dans les versions ultérieures, il a été supprimé car les données n'étaient pas conservées et aucune autre source fiable n'a pu être trouvée.
KIKO Software

1
Idem, très basique pour l'expression régulière du code postal français. Utilisez celui-ci "^ ((0 [1-9]) | ([1-8] [0-9]) | (9 [0-8]) | (2A) | (2B)) [0-9] {3} $ "-> developpez.net/forums/d518232/webmasters-developpement-web/…
Vincent D.

J'utilise i18napis.appspot.com/address/data/GB maintenant; y a-t-il des problèmes avec ce service?
mgol

1
Petite correction au commentaire de @ kiko-software: la dernière version contenant les données du code postal est la 27.0.3 .
Sietse

89

utiliser ces regx

$ZIPREG=array(
    "US"=>"^\d{5}([\-]?\d{4})?$",
    "UK"=>"^(GIR|[A-Z]\d[A-Z\d]??|[A-Z]{2}\d[A-Z\d]??)[ ]??(\d[A-Z]{2})$",
    "DE"=>"\b((?:0[1-46-9]\d{3})|(?:[1-357-9]\d{4})|(?:[4][0-24-9]\d{3})|(?:[6][013-9]\d{3}))\b",
    "CA"=>"^([ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ])\ {0,1}(\d[ABCEGHJKLMNPRSTVWXYZ]\d)$",
    "FR"=>"^(F-)?((2[A|B])|[0-9]{2})[0-9]{3}$",
    "IT"=>"^(V-|I-)?[0-9]{5}$",
    "AU"=>"^(0[289][0-9]{2})|([1345689][0-9]{3})|(2[0-8][0-9]{2})|(290[0-9])|(291[0-4])|(7[0-4][0-9]{2})|(7[8-9][0-9]{2})$",
    "NL"=>"^[1-9][0-9]{3}\s?([a-zA-Z]{2})?$",
    "ES"=>"^([1-9]{2}|[0-9][1-9]|[1-9][0-9])[0-9]{3}$",
    "DK"=>"^([D|d][K|k]( |-))?[1-9]{1}[0-9]{3}$",
    "SE"=>"^(s-|S-){0,1}[0-9]{3}\s?[0-9]{2}$",
    "BE"=>"^[1-9]{1}[0-9]{3}$",
    "IN"=>"^\d{6}$"
);

7
L'une des meilleures tentatives que j'ai vues pour répondre au PO. Obtenez plus lent que vous annoncez plus, mais une approche claire et claire.
Rob

3
Cela ne ralentit pas lorsque vous en ajoutez plus, comme le suggère Rob, car vous choisiriez l'une des expressions régulières du code de pays.
Thomaschaaf

2
Je vois que vous avez publié ceci en 2012. Vous en avez plus depuis?
rybo111

@ rybo111 vérifier la réponse Chi.
Giulio Caccin

5
@ ddunn801, il y a une différence (énorme) entre la validation du modèle et l'authentification du code postal. L'authentification des codes est des ordres de grandeur entiers plus difficiles car (au moins aux États-Unis) des codes postaux sont ajoutés et supprimés régulièrement. Dans un monde idéal, vous effectueriez une vérification rapide pour valider le modèle avant de le soumettre à un service (par exemple, USPS) pour valider l'adresse postale complète (des services comme celui-ci sont payés, vous détesteriez gaspiller la valeur avec de mauvaises données ). Hélas, le monde est loin d'être idéal.
JBH

48
  1. Chaque système de code postal utilise uniquement AZ et / ou 0-9 et parfois espace / tiret

  2. Tous les pays n'utilisent pas les codes postaux (ex. L'Irlande en dehors de Dublin), mais nous l'ignorerons ici.

  3. Le format de code postal le plus court est la Sierra Leone avec NN

  4. Le plus long est le Samoa américain avec NNNNN-NNNNNN

  5. Vous devez autoriser un espace ou un tiret.

  6. Ne doit ni commencer ni se terminer par un espace ou un tiret

Cela devrait couvrir les points ci-dessus:

(?i)^[a-z0-9][a-z0-9\- ]{0,10}[a-z0-9]$

8
Cela semble être la seule réponse qui fournit un contrôle de santé mentale (qui est probablement ce que le PO voulait) plutôt qu'une validation complète de chaque combinaison possible. Exactement ce que je voulais thx
Lukos

1
@GiulioCaccin H0H0H0 est un code postal canadien valide (que les enfants utilisent pour obtenir des lettres de Postes Canada se faisant passer pour le Père Noël), mais cela ne signifie pas que c'est un code postal client valide :)
Neil McGuigan

2
Pour info, les Samoa américaines sont assez petites pour n'avoir qu'un seul code postal et c'est 96799
naterkane

5
À mon avis, c'est la seule bonne réponse. Il peut universellement être utilisé comme pré-validation dans l'attribut de modèle HTML par exemple.
Blackbam

2
Je pense que c'est une bonne réponse pour la situation où l'on veut juste avoir un contrôle de santé mentale et ne pas valider précisément par pays. Juste pour avoir un peu de données plus propres sans trop d'effort - dans les cas où une sécurité totale est nécessaire, un plugin / service tiers pourrait être nécessaire comme d'autres l'ont souligné.
Yo Ludke

17

Essayer de couvrir le monde entier avec une seule expression régulière n'est pas complètement possible, et certainement pas faisable ou recommandé.

Pour ne pas tirer ma corne, mais j'ai écrit quelques expressions régulières assez approfondies que vous pourriez trouver utiles.

  • Codes postaux canadiens

    Basic validation:
    ^[ABCEGHJ-NPRSTVXY]{1}[0-9]{1}[ABCEGHJ-NPRSTV-Z]{1}[ ]?[0-9]{1}[ABCEGHJ-NPRSTV-Z]{1}[0-9]{1}$
    
    Extended validation:
    ^(A(0[ABCEGHJ-NPR]|1[ABCEGHK-NSV-Y]|2[ABHNV]|5[A]|8[A])|B(0[CEHJ-NPRSTVW]|1[ABCEGHJ-NPRSTV-Y]|2[ABCEGHJNRSTV-Z]|3[ABEGHJ-NPRSTVZ]|4[ABCEGHNPRV]|5[A]|6[L]|9[A])|C(0[AB]|1[ABCEN])|E(1[ABCEGHJNVWX]|2[AEGHJ-NPRSV]|3[ABCELNVYZ]|4[ABCEGHJ-NPRSTV-Z]|5[ABCEGHJ-NPRSTV]|6[ABCEGHJKL]|7[ABCEGHJ-NP]|8[ABCEGJ-NPRST]|9[ABCEGH])|G(0[ACEGHJ-NPRSTV-Z]|1[ABCEGHJ-NPRSTV-Y]|2[ABCEGJ-N]|3[ABCEGHJ-NZ]|4[ARSTVWXZ]|5[ABCHJLMNRTVXYZ]|6[ABCEGHJKLPRSTVWXZ]|7[ABGHJKNPSTXYZ]|8[ABCEGHJ-NPTVWYZ]|9[ABCHNPRTX])|H(0[HM]|1[ABCEGHJ-NPRSTV-Z]|2[ABCEGHJ-NPRSTV-Z]|3[ABCEGHJ-NPRSTV-Z]|4[ABCEGHJ-NPRSTV-Z]|5[AB]|7[ABCEGHJ-NPRSTV-Y]|8[NPRSTYZ]|9[ABCEGHJKPRSWX])|J(0[ABCEGHJ-NPRSTV-Z]|1[ACEGHJ-NRSTXZ]|2[ABCEGHJ-NRSTWXY]|3[ABEGHLMNPRTVXYZ]|4[BGHJ-NPRSTV-Z]|5[ABCJ-MRTV-Z]|6[AEJKNRSTVWYXZ]|7[ABCEGHJ-NPRTV-Z]|8[ABCEGHLMNPRTVXYZ]|9[ABEHJLNTVXYZ])|K(0[ABCEGHJ-M]|1[ABCEGHJ-NPRSTV-Z]|2[ABCEGHJ-MPRSTVW]|4[ABCKMPR]|6[AHJKTV]|7[ACGHK-NPRSV]|8[ABHNPRV]|9[AHJKLV])|L(0[[ABCEGHJ-NPRS]]|1[ABCEGHJ-NPRSTV-Z]|2[AEGHJMNPRSTVW]|3[BCKMPRSTVXYZ]|4[ABCEGHJ-NPRSTV-Z]|5[ABCEGHJ-NPRSTVW]|6[ABCEGHJ-MPRSTV-Z]|7[ABCEGJ-NPRST]|8[EGHJ-NPRSTVW]|9[ABCGHK-NPRSTVWYZ])|M(1[BCEGHJ-NPRSTVWX]|2[HJ-NPR]|3[ABCHJ-N]|4[ABCEGHJ-NPRSTV-Y]|5[ABCEGHJ-NPRSTVWX]|6[ABCEGHJ-NPRS]|7[AY]|8[V-Z]|9[ABCLMNPRVW])|N(0[ABCEGHJ-NPR]|1[ACEGHKLMPRST]|2[ABCEGHJ-NPRTVZ]|3[ABCEHLPRSTVWY]|4[BGKLNSTVWXZ]|5[ACHLPRV-Z]|6[ABCEGHJ-NP]|7[AGLMSTVWX]|8[AHMNPRSTV-Y]|9[ABCEGHJKVY])|P(0[ABCEGHJ-NPRSTV-Y]|1[ABCHLP]|2[ABN]|3[ABCEGLNPY]|4[NPR]|5[AEN]|6[ABC]|7[ABCEGJKL]|8[NT]|9[AN])|R(0[ABCEGHJ-M]|1[ABN]|2[CEGHJ-NPRV-Y]|3[ABCEGHJ-NPRSTV-Y]|4[AHJKL]|5[AGH]|6[MW]|7[ABCN]|8[AN]|9[A])|S(0[ACEGHJ-NP]|2[V]|3[N]|4[AHLNPRSTV-Z]|6[HJKVWX]|7[HJ-NPRSTVW]|9[AHVX])|T(0[ABCEGHJ-MPV]|1[ABCGHJ-MPRSV-Y]|2[ABCEGHJ-NPRSTV-Z]|3[ABCEGHJ-NPRZ]|4[ABCEGHJLNPRSTVX]|5[ABCEGHJ-NPRSTV-Z]|6[ABCEGHJ-NPRSTVWX]|7[AENPSVXYZ]|8[ABCEGHLNRSVWX]|9[ACEGHJKMNSVWX])|V(0[ABCEGHJ-NPRSTVWX]|1[ABCEGHJ-NPRSTV-Z]|2[ABCEGHJ-NPRSTV-Z]|3[ABCEGHJ-NRSTV-Y]|4[ABCEGK-NPRSTVWXZ]|5[ABCEGHJ-NPRSTV-Z]|6[ABCEGHJ-NPRSTV-Z]|7[ABCEGHJ-NPRSTV-Y]|8[ABCGJ-NPRSTV-Z]|9[ABCEGHJ-NPRSTV-Z])|X(0[ABCGX]|1[A])|Y(0[AB]|1[A]))[ ]?[0-9]{1}[ABCEGHJ-NPRSTV-Z]{1}[0-9]{1}$
  • Codes postaux américains

    ^[0-9]{5}(-[0-9]{4})?$
  • Codes postaux britanniques

    ^([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}|(GIR\ 0AA)|(SAN\ TA1)|(BFPO\ (C\/O\ )?[0-9]{1,4})|((ASCN|BBND|[BFS]IQQ|PCRN|STHL|TDCU|TKCA)\ 1ZZ))$

Il n'est pas possible de garantir l'exactitude sans réellement envoyer quelque chose à une adresse et sans que la personne vous informe quand elle le reçoit, mais nous pouvons affiner les choses en éliminant les cas que nous savons mauvais.


La version étendue des codes postaux canadiens pourrait avoir quelque chose de mal ou de manquant, car elle indique que le code postal suivant n'est pas valide: E3G 0A1, bien qu'il soit valide.
fsschmitt

J'ai validé par rapport à tous les 845 495 codes postaux au Canada et cette chaîne d'expression régulière a quelques correctifs sur la validation étendue pour prendre en charge tous ces codes postaux. Voici la nouvelle chaîne d'expression régulière pour la validation étendue sur les codes postaux canadiens: pastebin.com/vazqFKy4
fsschmitt

14

Cela ressemble à une bonne référence même si ce n'est pas dans Regex.

Vraiment, sauf si vous expédiez quelque chose à vos utilisateurs, je ne pense pas que cela en vaille la peine. Et si vous êtes expédiez, il y a des outils de nettoyage d'adresses / services que vous pouvez regarder dans pour le rendre plus facile sur vous - même.


De plus, même s'il s'agit du bon code postal aujourd'hui, il pourrait très bien changer à l'avenir. USPS en ajoute constamment de nouveaux et divise les zones. La seule façon de suivre est de valider au moment où vous expédiez réellement quelque chose. Certaines villes choisissent même de changer leur propre code postal pour diverses raisons.
NotMe

On dirait que quelqu'un a pris l'article wiki que vous avez posté ci-dessus et l'a sorti
Chris Smith

8

Nous utilisons ce qui suit:

Canada

([A-Z]{1}[0-9]{1}){3}   //We raise to upper first

Amérique

[0-9]{5}                //-or-
[0-9]{5}-[0-9]{4}       //10 digit zip

Autre

Accepter tel quel


1
Je suggère d'ajouter un facultatif - [0-9] {4} à celui des États-Unis. Certaines personnes utilisent leur ZIP + 4.
David Thornley

4
/ [0-9] {5} (?: - [0-9] {4})? / Vous permet de valider les deux styles aux États-Unis en même temps.
Chas. Owens

2
@ Chas.Owens ajoutant ^ et $ garantissent qu'ils ne peuvent rien taper avant ou après, comme "12345aaa" ... / ^ [0-9] {5} (?: - [0-9] {4}) ? $ /
Tim Franklin

7

Selon votre application, vous souhaiterez peut-être implémenter une correspondance d'expression régulière pour les pays d'origine de la plupart de vos visiteurs et aucune validation pour le reste (acceptez quoi que ce soit).


6
.* 

Big Jump a oublié les sauts de ligne, les blancs et les caractères de contrôle.

Les codes postaux internationaux sont une sorte de problème d'arrêt.


6

Veuillez noter que c'est un problème assez difficile, comme indiqué par la réponse acceptée. Je suppose que cela n'a pas dissuadé les gens de geonames.org . Ils ont un fichier un fichier d'informations sur le pays , qui ne correspond pas à cette réponse - la limite est apparemment de 30000 caractères. Il existe des expressions régulières pour environ 150 pays.

J'ai extrait les bits pertinents à cette question ici:

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})$
BY ^(\d{6})$
CA ^([ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ]) ?(\d[ABCEGHJKLMNPRSTVWXYZ]\d)$
CH ^(\d{4})$
CL ^(\d{7})$
CN ^(\d{6})$
CR ^(\d{4})$
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})$
CS ^(\d{5})$

J'espère que je n'ai fait aucune erreur, mon regex-fu est assez faible.


1
Je voudrais souligner que les regex pour la France et la Grande-Bretagne ne tiennent pas compte des espaces possibles; En France, les codes postaux peuvent être entrés avec un espace entre les deuxième et troisième chiffres (soit 75 001 au lieu de 75001). Les codes postaux britanniques sont assez souvent écrits avec un espace (c'est-à-dire SW1 1AA au lieu de SW11AA).
salcoin

@salcoin Merci pour la contribution, je ne l'ai pas remarqué (même si je suis français). On dirait que la réponse de Chi est meilleure à cet égard.
2015

parce que str_replace un espace sans espace est super taxable non? : p
Robert Pounder

6

Si quelqu'un souhaite toujours valider les codes postaux, j'ai trouvé une solution:

En utilisant Google Geocoding APInous pouvons vérifier la validité du code postal ayant à la fois le code pays et un code postal lui-même.

Par exemple, je vis en Ukraine, je peux donc vérifier comme ceci: https://maps.googleapis.com/maps/api/geocode/json?components=postal_code:80380|country:UA

Ou en utilisant JS API: https://developers.google.com/maps/documentation/javascript/geocoding#ComponentFiltering

80380est valide ZIP pour l'Ukraine, en fait chaque (#####) est valide.

Google renvoie l' ZERO_RESULTSétat si rien n'est trouvé. Ou OKet un résultat si les deux sont corrects.

J'espère que cela vous sera utile.


Le seul problème serait la limite du nombre de requêtes, qui, selon le site / la taille, pourrait être un problème.
Darryl Hein

@ DarrylHein bien sûr, mais c'est maintenant un prix assez élevé pour le faire fonctionner =)
Romko

4

Comme d'autres l'ont souligné, une expression rationnelle pour les gouverner tous est peu probable. Cependant, vous pouvez créer des expressions régulières pour autant de pays que vous le souhaitez en utilisant les informations de formatage d'adresse de l'Union postale universelle - une agence des Nations Unies peu connue.

Par exemple, voici les règles de formatage d'adresse, y compris le code postal, pour une poignée de pays (format PDF):


2

Le problème va être que vous n'avez probablement aucun bon moyen de suivre l'évolution des exigences en matière de code postal des pays de l'autre côté du globe et que vous ne partagez pas de langues communes. À moins que vous n'ayez un budget suffisamment important pour le suivre, vous feriez certainement mieux de confier la responsabilité de la validation des adresses à Google ou Yahoo.

Les deux sociétés fournissent des fonctionnalités de recherche d'adresses via une API programmable.


1

Pourquoi faites-vous cela et pourquoi vous en souciez-vous? Comme l'a souligné Tom Ritter, peu importe que vous ayez même un code postal, encore moins qu'il soit valide ou non, jusqu'à ce que vous envoyiez quelque chose à cette adresse. Même si vous vous attendez à leur envoyer quelque chose un jour , cela ne signifie pas que vous avez besoin d'un code postal aujourd'hui .


Oui, mais s'ils vont en entrer un, autant s'assurer qu'ils sont corrects à ce stade. Cependant, je suis d'accord avec l'une des autres réponses qui dit essentiellement, faites-la valider pour les pays qui, selon vous, seront la majorité de vos clients.
cdmckay

1
Certaines chambres de compensation n'acceptent pas de facture à moins que le zip soit correct. Je préfère valider le zip en entrée, plutôt que de soumettre la charge et de la faire rejeter.
SamGoody

1

Comme indiqué ailleurs, la variation dans le monde est énorme. Et même si quelque chose qui correspond au motif ne signifie pas qu'il existe.

Ensuite, bien sûr, il existe de nombreux endroits où les codes postaux ne sont pas utilisés (par exemple beaucoup ou en Irlande).


En fait, probablement toute l'Irlande, car je ne pense pas que D1, D2, etc. soient considérés comme des codes postaux appropriés car vous ne pouvez pas identifier une adresse en utilisant uniquement ce code et un numéro de rue.
Dónal

1

Il y a des raisons au-delà de l'expédition pour avoir un code postal précis. Les agences de voyages effectuant des circuits transfrontaliers (hors zone euro bien sûr) ont besoin de ces informations à l'avance pour les communiquer aux autorités. Souvent, ces informations sont saisies par un agent qui peut ou non être familier avec de telles choses. TOUTE méthode qui peut réduire les erreurs est une bonne idée ™

Cependant, écrire une expression régulière qui couvrirait tous les codes postaux dans le monde serait insensé.


1
Ce n'est qu'une bonne idée jusqu'à ce que le code commence à rejeter les codes postaux valides, soit parce qu'il est bogué, soit parce que les codes postaux ont changé. La validation est quelque chose qui doit être juste ou pas du tout. À tout le moins, il devrait y avoir une option prioritaire.
Chas. Owens

1

Étant donné qu'il y a tellement de cas marginaux pour chaque pays (par exemple, les adresses de Londres peuvent utiliser un format légèrement différent du reste du Royaume-Uni), je ne pense pas qu'il existe une expression rationnelle ultime autre que peut-être:

[0-9a-zA-Z]+

Mieux vaut suivre un modèle assez large (enfin pas aussi large que ci-dessus), ou traiter chaque pays / région avec un modèle spécifique qui lui est propre!

METTRE À JOUR: Cependant, il peut être possible de construire dynamiquement une expression régulière basée sur de nombreuses règles plus petites et spécifiques à une région - mais pas sûr des performances!

De nombreux modèles spécifiques aux pays peuvent être trouvés sur le site RegExLib .


1

Quelqu'un demandait une liste d'adresses de mise en forme, et je pense que c'est ce qu'il cherchait ...

Guide compulsif des adresses postales de Frank: http://www.columbia.edu/~fdc/postal/ n'aide pas beaucoup avec les problèmes au niveau de la rue, cependant.

Mon travail utilise quelques outils pour aider à cela: - Services Lexis-Nexis, y compris les recherches NCOA (vous obtiendrez la normalisation des adresses "gratuitement") - "Melissa Data" http://www.melissadata.com


1

Il s'agit d'un RegEx très simple pour valider le code postal américain (pas ZipCode Plus Four):

(?!([089])\1{4})\d{5}

Il semble que les cinq chiffres soient des codes postaux valides 00000, sauf , 88888&99999 .

J'ai testé ce RegEx avec http://regexpal.com/

SP


Ce RegEx n'applique pas quatre chiffres pour la portion zip + 4. Par exemple, il considère "92122-1" un code postal valide.
Sensei James

0

Si Zip Codeautorise les caractères et les chiffres (alphanumériques), l'expression rationnelle ci-dessous serait utilisée là où elle correspond, 5 ou 9 ou 10 caractères alphanumériques avec un hypen ( -):

^([0-9A-Za-z]{5}|[0-9A-Za-z]{9}|(([0-9a-zA-Z]{5}-){1}[0-9a-zA-Z]{4}))$
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.