验证英国邮政编码 - 短版和长版

Validate UK Postcode - both short and long version

我已经尝试过 .gov 网站上的那个,正如这里的许多问题所述,但它似乎不适用于短邮政编码。

我的正则表达式:

preg_match('^(([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}))^', $this->post['location'], $matches)

当我使用格式很长的邮政编码时:AA9 9ZZ 它有效,但其中一种格式 AA9 无效。我需要以下格式才能工作:

^[A-Z]{1,2}\d{1,2}(?:(?: )?\d[A-Z]{2})?$ 是我想出的模式,它似乎有效。

不过,这可能可以改进。我不是正则专家。

Here's a live example

根据你给出的模式,将第二部分设为可选,我得到:

~^(?:gir(?: *0aa)?|[a-pr-uwyz](?:[a-hk-y]?[0-9]+|[0-9][a-hjkstuw]|[a-hk-y][0-9][abehmnprv-y])(?: *[0-9][abd-hjlnp-uw-z]{2})?)$~i

demo

或使其更具可读性:

~ # pattern delimiter
^ # start of the string anchor
(?: # branch 1
    gir
    (?:[ ]*0aa)? # second part optional (branch 1)
  | # branch 2
    [a-pr-uwyz] # I put it in factor to shorten the pattern
    (?:
        [a-hk-y]?[0-9]+
      |
        [0-9][a-hjkstuw]
      |
        [a-hk-y][0-9][abehmnprv-y]
    )
    (?:[ ]*[0-9][abd-hjlnp-uw-z]{2})? # second part optional (branch 2)
)
$ # end of the string anchor
~ix

由于英国邮政编码的工作方式,使用正则表达式验证它们并不是万无一失的解决方案。两个主要问题是:

  • 皇家邮政可以更改某些邮政编码的格式,添加您选择使用的正则表达式未涵盖的分区。
  • 通过正则表达式验证只能确保邮政编码根据您的正则表达式规则采用有效格式,而不是作为地址的一部分存在的邮政编码。

皇家邮政提供 PAF Database,其中包含所有英国地址,包括邮政编码。许多公司通过 API 和网站插件公开了这些数据。

例如,我在一家名为 PCA Predict 的公司工作,我们有 a demo 个解决方案在运行。这是一个在线结帐表单插件,允许客户开始输入他们地址的任何部分,并在他们 select 时自动填写字段。

我们还提供 REST API 来静默验证和 return 地址。

如果您在地址验证方面需要任何帮助,请随时发表评论,因为它可能比最初看起来要难得多!我也不是说您应该使用我们的服务,但请试一试,并 Google 了解其他选项。

我遇到了同样的问题,很难验证邮政编码,皇家邮政经常添加和删除邮政编码。所以在过去的两周里,我一直在构建一个地址数据库,并免费创建了一个非常难看的 API 你可以验证邮政编码,它会 return 该邮政编码的每个地址。​​

希望对您有所帮助。

https://www.pervazive.co.uk/free-api-for-uk-postcode-lookup/

端点

GET: https://api.pervazive.co.uk/postcode.php?postcode=[POSTCODE]

回应

Request GET: -> https://api.pervazive.co.uk/postcode.php?postcode=AB10+1AB

Return 格式:JSON

{"predictions":[
{"ID":"0","Address":"Aberdeen City Council, Marischal College, Broad Street, Aberdeen, Aberdeenshire, AB10 1AB","Postcode":"AB10 1AB"}
],"Execution_Time":"0.50983214378357","status":"200"}