模式匹配部分英国邮政编码

时间:2014-05-29 09:55:24

标签: php regex postal-code

我在我继承的php项目中有这种模式。

^(([gG][iI][rR] {0,}0[aA]{2})|((([a-pr-uwyzA-PR-UWYZ][a-hk-yA-HK-Y]?[0-9][0-9]?)|(([a-pr-uwyzA-PR-UWYZ][0-9][a-hjkstuwA-HJKSTUW])|([a-pr-uwyzA-PR-UWYZ][a-hk-yA-HK-Y][0-9][abehmnprv-yABEHMNPRV-Y]))) {0,}[0-9][abd-hjlnp-uw-zABD-HJLNP-UW-Z]{2}))$

当用于验证完整的英国邮政编码(例如LE1 1AA)时,其适用于所有实际目的。但是我需要调整它以允许部分邮政编码,如LE1,SN5等,只提供第一段。

有人可以建议如何进行调整吗?

2 个答案:

答案 0 :(得分:2)

这应该做的工作

^(([gG][iI][rR] {0,}0[aA]{2})|((([a-pr-uwyzA-PR-UWYZ][a-hk-yA-HK-Y]?[0-9][0-9]?)|(([a-pr-uwyzA-PR-UWYZ][0-9][a-hjkstuwA-HJKSTUW])|([a-pr-uwyzA-PR-UWYZ][a-hk-yA-HK-Y][0-9][abehmnprv-yABEHMNPRV-Y])))( {0,}[0-9][abd-hjlnp-uw-zABD-HJLNP-UW-Z]{2})?))$

http://ideone.com/lLg4uD

答案 1 :(得分:0)

首先:

英国邮政编码正确的正则表达式(或多或少似乎与您相似,但我没有时间/意愿检查每个可能的情况):

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

According to the geonames' data(英国官方iso代码为GB,英国保留,地理编码:2635167)

始终根据此数据格式为:

@# #@@|@## #@@|@@# #@@|@@## #@@|@#@ #@@|@@#@ #@@|GIR0AA

在哪里,IIRC,@代表字符,#代表数字。 因此,要仅检索GB邮政编码的第一部分,您的格式将变为:

@#|@##|@@#|@@##|@#@|@@#@|GIR

假设这是你要实现的部分检查,正则表达式将成为:

^(([A-Z]\d)|([A-Z]\d{2})|([A-Z]{2}\d)|([A-Z]{2}\d{2})|([A-Z]\d[A-Z])|([A-Z]{2}\d[A-Z])|(GIR))$

当然,您可能希望同时支持大写和小写字符,如果是这种情况,只需将所有[A-Z]次出现更改为[A-Za-z],将GIR更改为{{1} }

请记住,如果代码存在,这将仅验证邮政编码的格式,为此您可以从geonames.org下载信息并将其解析到数据库中以供日后检查