Nihai posta kodu ve zip regex nedir?


201

Nihai posta kodu ve posta kodu regex arıyorum. Dünyanın çoğunu (umarım hepsini) kapsayacak bir şey arıyorum.


4
Tüm posta kodları için tek bir normal ifade, çoğu durumda çok sayıda unicode kodlama gerektirdiğini belirtmek için işe yaramaz. "New York, NY AF23Q" gibi şeyleri doğru olarak doğrulamamanız için ülke bazında normal ifadeyi kontrol etmek çok daha iyidir.
Evet - şu Jake.

101
Bir sorunun var. Bunun için bir normal ifade yazıyorsunuz. Şimdi iki sorunun var.
Robert

Bir alanı doğrulamak için regexlib.com/Search.aspx?k=decimal&c=3&m=-1&ps=100 buraya gidin
Dinesh Kumar

2
Gelecekteki tüm olası değerleri işleyen.
Jodrell

Yanıtlar:


127

Hiç yok.

Dünyadaki posta / posta kodları ortak bir kalıp izlemez. Bazı ülkelerde sayılardan oluşurlar, diğerlerinde bir harf sayıları kombinasyonu olabilir, bazıları boşluk içerebilir, diğerleri nokta olabilir, karakter sayısı iki ila en az altı arasında değişebilir ...

Yapabileceğiniz (teorik olarak), IMO'nun tavsiye edilmemesi değil, dünyadaki her ülke için ayrı bir normal ifade oluşturmaktır. Ancak doğrulama bölümünde hala eksik olacaksınız: Posta kodu 12345olabilir, ancak 12346olmayabilir, belki de 12344yoktur. Normal ifadeyle bunu nasıl kontrol edersiniz?

Yapamazsın.


Normal ifadenin derlenebileceğinden şüpheleniyorum, ancak böyle bir görevin bir veritabanına çok daha uygun olması. Normal ifade 10000 | 10001 | 10002 | 10003 | ....... gibi bir şey olurdu
Kibbee

bir alanı doğrulamak için buraya gidin regexlib.com/Search.aspx?k=decimal&c=3&m=-1&ps=100
Dinesh Kumar

Önce ülkenize uygun bir normal ifade kullanabilirsiniz (bkz. En.wikipedia.org/wiki/List_of_postal_codes ) ve geonames.org/export/ws-overview.html
SimonSimCity

3
Benim iki sent: Brezilya'da aslında 8 sayı, 5 ardından bir tire ve 3 daha
Jorge Campos

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

262

Unicode CLDR, her ülke için posta kodu normal ifadesini içerir. (Toplam 158 normal ifade!)

Google ayrıca burada, posta kodları da dahil olmak üzere ülke başına adres biçimlendirme bilgilerini içeren bir web hizmetine de sahiptir - http://i18napis.appspot.com/address (Bu bağlantıyı http://unicode.org/review/pri180/ aracılığıyla buldum )

Düzenle

Burada postalCodeData.xml regex'in bir kopyası :

"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
AU posta kodu-regex'in hızlı bir şekilde taranmasıyla ... bu normal ifade çok basittir ve çok sayıda yanlış pozitiflere izin verir, bu yüzden kapsamlı değildir.
Taryn East

7
Unicode CLDR'nin posta kodu normal ifadesini içeren en son sürümü 26.0.1 sürümüdür. Daha sonraki sürümlerde, veriler korunmadığından ve başka güvenilir kaynak bulunamadığından kaldırılmıştır.
KIKO Software

1
Aynı, fransız Posta kodu regex için çok temel. Bunu kullan "^ ((0 [1-9]) | ([1-8] [0-9]) | (9 [0-8]) | (2A) | (2B)) [0-9] {3} $ "-> developppez.net/forums/d518232/webmasters-developpement-web/…
Vincent D.

Şimdi i18napis.appspot.com/address/data/GB kullanıyorum ; bu hizmetle ilgili herhangi bir sorun var mı?
mgol

1
@ Kiko-software yorumunda küçük düzeltme: posta kodu verilerini içeren en son sürüm 27.0.3'tür .
Sietse

89

bu regx'i kullan

$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
OP'ye gerçekten cevap vermek için gördüğüm daha iyi girişimlerden biri. Daha fazla reklam verdikçe yavaşlayın, temiz ve net bir yaklaşım.
Rob

3
Rob'un önerdiği gibi ülke kodundan regex'lerden birini seçeceğiniz gibi daha fazla eklediğinizde yavaşlamaz.
Thomaschaaf

2
Bunu 2012'de gönderdiğini görüyorum. O zamandan beri daha var mı?
rybo111

@ rybo111 Chi cevap kontrol edin.
Giulio Caccin

5
@ ddunn801'de, kalıbı doğrulamak ve posta kodunu doğrulamak arasında (çok büyük) bir fark vardır. Kodların kimliğini doğrulamak, büyüklük sıralarının tamamını daha zordur, çünkü (en azından ABD'de) posta kodları düzenli olarak eklenir ve bırakılır. İdeal bir dünyada, tüm posta adresini doğrulamak için bir servise (örn. USPS) göndermeden önce kalıbı doğrulamak için hızlı bir kontrol yaparsınız (bunun gibi hizmetler ödenir, değeri kötü verilerle harcamaktan nefret edersiniz) ). Ne yazık ki, dünya ideal olmaktan uzak.
JBH

49
  1. Her posta kodu sistemi yalnızca AZ ve / veya 0-9 ve bazen boşluk / tire kullanır

  2. Her ülke posta kodu kullanmaz (örneğin, Dublin dışındaki İrlanda), ancak burada görmezden geleceğiz.

  3. En kısa posta kodu biçimi Sierra Leone'dir. NN

  4. En uzun Amerikan Samoası NNNNN-NNNNNN

  5. Bir boşluğa veya kısa çizgiye izin vermelisiniz.

  6. Boşluk veya tire ile başlamamalı veya bitmemelidir

Bu aşağıdakileri kapsamalıdır:

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

8
Muhtemelen her kombinasyonun tam olarak doğrulanmasından ziyade (bu muhtemelen OP'nin istediği şey) bir sağlık kontrolü sağlayan tek cevap gibi görünüyor. Tam olarak ne istedim thx
Lukos

1
@GiulioCaccin H0H0H0 geçerli bir Kanada Posta Kodu (çocukların Noel Baba gibi davranarak Kanada Postası'ndan mektup almak için kullandıkları), ancak bu geçerli bir müşteri posta kodu olduğu anlamına gelmez :)
Neil McGuigan

2
Amerikan Samoası, sadece bir posta koduna sahip olacak kadar küçük ve 96799
naterkane

5
Bence bu tek iyi cevap. Örneğin, HTML kalıbı özelliğinde ön doğrulama olarak evrensel olarak kullanılabilir.
Blackbam

2
Bence bu sadece bir akıl sağlığı kontrolünün olmasını ve ülke başına kesin olarak doğrulanmasını istemediği durum için iyi bir cevaptır. Çok fazla çaba sarf etmeden biraz daha temiz verilere sahip olmak için - tam güvenliğin gerekli olduğu durumlarda, başkalarının da işaret ettiği gibi üçüncü taraf bir eklenti / hizmet gerekebilir.
Yo Ludke

17

Tüm dünyayı tek bir düzenli ifade ile örtmeye çalışmak tamamen mümkün değildir ve kesinlikle mümkün ya da tavsiye edilemez.

Kendi kornamı tootlamak için değil, ama yararlı bulabileceğiniz oldukça ayrıntılı düzenli ifadeler yazdım.

  • Kanada posta kodları

    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}$
  • ABD posta kodları

    ^[0-9]{5}(-[0-9]{4})?$
  • İngiltere posta kodları

    ^([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))$

Bir adrese gerçekten bir şey göndermeden ve kişinin onu ne zaman aldığını size bildirmeden doğruluğu garanti etmek mümkün değildir, ancak kötü olduğunu bildiğimiz vakaları ortadan kaldırarak bir şeyleri daraltabiliriz.


Kanada Posta Kodları için genişletilmiş sürümde, aşağıdaki posta kodunun geçersiz olduğu belirtildiği için yanlış veya eksik bir şey olabilir: E3G 0A1, geçerli bir kod olmasına rağmen.
fsschmitt

Kanada'daki tüm 845,495 posta kodlarına karşı onayladım ve bu normal ifade dizesi, bu posta kodlarının tümünü desteklemek için Genişletilmiş doğrulama üzerinde bazı düzeltmelere sahip. İşte Kanada Posta Kodları üzerinde genişletilmiş doğrulama için yeni normal ifade dizesi: pastebin.com/vazqFKy4
fsschmitt

14

Regex'te olmasa da bu iyi bir referansa benziyor .

Gerçekten, kullanıcılarınıza bir şey göndermediğiniz sürece , çabaya değeceğini düşünmüyorum. Eğer olursa edilir onu nakliye Kendini çok yönlü kolaylaştırmak için içine bakabilirsiniz adres temizleme araçları / hizmetler vardır.


Ayrıca, bugün doğru posta kodu olsa bile, gelecekte çok iyi değişebilir. USPS sürekli yeni alanlar ve bölme alanları ekliyor. Devam edebilmenin tek yolu, bir şey gönderirken doğrulamaktır. Bazı kasabalar çeşitli nedenlerle kendi posta kodlarını değiştirmeyi bile seçmektedir.
NotMe

Birisi yukarıda yayınladığınız wiki makalesini aldı ve her ülke için posta / posta kodu regex ile JSON'a
Chris Smith

8

Aşağıdakileri kullanıyoruz:

Kanada

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

Amerika

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

Diğer

Olduğu gibi kabul et


1
ABD'ye isteğe bağlı - [0-9] {4} eklemenizi öneririm. Bazı insanlar ZIP + 4'lerini kullanır.
David Thornley

4
/ [0-9] {5} (?: - [0-9] {4})? / ABD'den her iki stili de aynı anda doğrulamanızı sağlar.
Chas. Owens

2
@ Chas.O ^ ve $ ekleyerek daha önce veya sonra başka bir şey yazamadıklarından emin olun, örneğin "12345aaa" ... / ^ [0-9] {5} (?: - [0-9] {4}) ? $ /
Tim Franklin

7

Başvurunuza bağlı olarak, ziyaretçilerinizin çoğunun köken aldığı ve geri kalanı için doğrulama yapılmayan ülkeler için normal ifade eşleştirmesi uygulamak isteyebilirsiniz (herhangi bir şeyi kabul edin).


6
.* 

Big Jump satır sonlarını, boşlukları ve kontrol karakterlerini unuttu.

Uluslararası posta kodları bir tür durma problemidir.


6

Kabul edilen cevapta belirtildiği gibi, bunun oldukça zor bir sorun olduğunu lütfen unutmayın. Sanırım geonames.org'daki insanları caydırmadı . Bu cevaba tam uymayan bir ülke bilgi dosyası bir dosya var - sınır 30000 karakter görünüşte. Yaklaşık 150 ülke için regexes var.

Bu soruyla ilgili bitleri burada çıkardım:

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})$

Umarım herhangi bir hata yapmadım, regex-fu'm oldukça zayıf.


1
Fransa ve İngiltere için normal ifadenin olası alanları dikkate almadığını belirtmek isterim; Fransa'da posta kodları, ikinci ve üçüncü basamaklar arasında boşlukla girilebilir (örn. 75001 yerine 75001). İngiliz posta kodları genellikle bir boşlukla yazılır (örneğin, SW11AA yerine SW1 1AA).
salcoin

@salcoin Giriş için teşekkürler, fark etmedim (Fransızca olduğum halde). Chi'nin cevabı bu açıdan daha iyi görünüyor.
nha

çünkü str_replace alanı olmayan bir alan süper vergilendirme değil mi? : p
Robert Pounder

6

Birisi hala posta kodlarını nasıl doğrulamakla ilgileniyorsa bir çözüm buldum:

Kullanılması Google Geocoding APIbiz de sahip posta kodu geçerliliğini kontrol edebilir Ülke kodu ve Posta kodu kendisi.

Örneğin Ukrayna'da yaşıyorum, bu yüzden şu şekilde kontrol edebilirim: https://maps.googleapis.com/maps/api/geocode/json?components=postal_code:80380|country:UA

Veya JS API'sını kullanarak: https://developers.google.com/maps/documentation/javascript/geocoding#ComponentFiltering

80380Ukrayna için geçerli ZIP nerede , aslında her (#####) geçerlidir.

ZERO_RESULTSHiçbir şey bulunmazsa Google durum döndürür . Veya OKher ikisi de doğruysa bir sonuç.

Umarım bu yardımcı olacaktır.


Tek sorun, siteye / boyuta bağlı olarak sorun olabilecek sorgu sayısındaki sınır olacaktır.
Darryl Hein

@DarrylHein Tabii ama şimdi işe almak için oldukça büyük bir fiyat =)
Romko


2

Sorun, muhtemelen dünyanın diğer tarafındaki ülkelerin değişen posta kodu gereksinimlerine ayak uyduracak ve ortak dilleri paylaşmadığınız için iyi bir yönteminizin olmamasıdır. Bunu izlemek için yeterince büyük bir bütçeniz yoksa, google veya yahoo adreslerini doğrulama sorumluluğunu vermek neredeyse kesinlikle daha iyidir.

Her iki şirket de programlanabilir bir API aracılığıyla adres arama olanakları sağlar.


1

Bunu neden yapıyorsun ve neden önemsiyorsun? Tom Ritter'in işaret ettiği gibi, aslında bir posta / posta koduna sahip olup olmanızın önemi yoktur, geçerli olup olmadığından çok daha az, o adrese bir şey göndermeyene kadar. Bir gün onlara bir şey göndermenizi bekleseniz bile , bugün posta koduna ihtiyacınız olduğu anlamına gelmez .


Evet ama eğer bir tanesine gireceklerse, bu noktada doğru olduğundan emin olabilirler. Bununla birlikte, temel olarak, müşterilerinizin çoğunluğu olacağını düşündüğünüz ülkeler için geçerli kılan diğer yanıtlardan birini kabul ediyorum.
cdmckay

1
Bazı kredi takas kurumları posta kodu doğru olmadığı sürece fatura kabul etmeyecektir. Ücreti göndermek ve reddedilmesini sağlamak yerine, girişte zip'i doğrulamayı tercih ederim.
SamGoody

1

Başka yerlerde de belirtildiği gibi, dünyadaki farklılıklar çok büyüktür. Ve kalıpla eşleşen bir şey var olduğu anlamına gelmez.

Sonra, elbette, posta kodlarının kullanılmadığı birçok yer var (örneğin çok veya İrlanda).


Aslında, D1, D2, vb. Sanmıyorum muhtemelen tüm İrlanda, sadece bu kodu ve bir sokak numarasını kullanarak bir adresi tanımlayamaz gibi uygun posta kodları olarak kabul edilir.
Dónal

1

Doğru posta koduna sahip olmak için gönderilmenin ötesinde nedenler vardır. Sınırları aşan turlar yapan seyahat acenteleri (elbette Euro bölgesi hariç) yetkililere vermek için önceden bu bilgilere ihtiyaç duyar. Genellikle bu bilgiler, bu tür şeyleri bilen veya bilmeyen bir ajan tarafından girilir. Hataları azaltabilen HERHANGİ bir yöntem Good Idea ™

Ancak, dünyadaki tüm posta kodlarını kapsayacak bir normal ifade yazmak delilik olur.


1
Kod, bu kodlu olduğu için veya posta kodları değiştiği için geçerli posta kodlarını reddetmeye başlayana kadar iyi bir fikirdir. Doğrulama, orada doğru ya da hiç olmaması gereken bir şeydir. En azından bir geçersiz kılma seçeneği olmalıdır.
Chas. Owens

1

Her ülke için çok fazla kenar durumu olduğu göz önüne alındığında (örneğin, Londra adresleri İngiltere'nin geri kalanına göre biraz farklı bir biçim kullanabilir) Belki de dışında nihai bir regex olduğunu düşünmüyorum:

[0-9a-zA-Z]+

En iyisi oldukça geniş bir modelle (yukarıdakiler kadar geniş değil) gitmek veya her ülkeye / bölgeye kendi başına belirli bir desenle davranmak!

GÜNCELLEME: Bununla birlikte, çok sayıda küçük, bölgeye özgü kurala dayalı olarak dinamik bir regex oluşturmak mümkün olabilir - ancak performanstan emin değilsiniz!

Ülkeye özgü birçok desen RegExLib sitesinde bulunabilir.


1

Birisi posta adreslerini biçimlendirme listesini soruyordu ve sanırım aradığı şey bu ...

Frank'in Posta Adresleri İçin Zorlayıcı Kılavuzu: http://www.columbia.edu/~fdc/postal/ Sokak düzeyinde sorunlara fazla yardımcı olmaz.

Çalışmam bu konuda yardımcı olmak için birkaç araç kullanıyor: - NCOA aramaları da dahil olmak üzere Lexis-Nexis hizmetleri ("ücretsiz" için adres standardizasyonu alacaksınız) - "Melissa Data" http://www.melissadata.com


1

Bu, ABD Posta Kodunu doğrulamak için çok basit bir RegEx'tir (ZipCode Plus Four değil):

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

Beş basamaklı sayıların tümü geçerli posta kodları gibi görünüyor 00000, 88888&99999 .

Bu RegEx ile test ettim http://regexpal.com/

SP


Bu RegEx, zip + 4 kısmı için dört haneyi zorunlu kılmaz. Örneğin, "92122-1" i geçerli bir posta kodu olarak kabul eder.
Sensei James

0

Zip CodeKarakterlere ve rakamlara izin verirse (alfasayısal), aşağıdaki regex, bir hipen ( -) ile 5 veya 9 veya 10 alfasayısal karakterle eşleştiğinde kullanılır :

^([0-9A-Za-z]{5}|[0-9A-Za-z]{9}|(([0-9a-zA-Z]{5}-){1}[0-9a-zA-Z]{4}))$
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.