【问题标题】:Pattern match a partial British postcode模式匹配部分英国邮政编码
【发布时间】:2014-05-29 09:55:24
【问题描述】:

我继承的一个 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 等,其中仅提供第一段。

谁能建议如何进行调整?

【问题讨论】:

    标签: php regex postal-code


    【解决方案1】:

    这应该可以完成工作

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

    【讨论】:

      【解决方案2】:

      首先:

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

      ^(([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 code是GB,UK是保留,geocode id: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 更改为[gG][iI][rR]

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多