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

Posted

技术标签:

【中文标题】验证英国邮政编码 - 短版和长版【英文标题】:Validate UK Postcode - both short and long version 【发布时间】:2016-12-05 11:50:16 【问题描述】:

我已经尝试过 .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 格式之一不起作用。我需要以下格式才能工作:

AA9 AA99 AA9 9ZZ AA99 9ZZ

【问题讨论】:

首先,不要使用^作为模式分隔符,而使用$来锚定你的模式。将捕获组替换为非捕获组,使用 i 标志,删除无用组。 @CasimiretHippolyte ive 现在改变了这一点,正则表达式似乎正在验证长邮政编码,但不是缩短版本.. 这只是工作的第一步(特别是使其更具可读性),而不是解决方案。 另外,如果其他解决方案不适合您,请尝试'~^(?:gir\ *0a2|(?:[a-pr-uwyz][a-hk-y]?[0-9][0-9]?|(?:[a-pr-uwyz][0-9][a-hjkstuw]|[a-pr-uwyz][a-hk-y][0-9][abehmnprv-y]))(?:\ *[0-9][abd-hjlnp-uw-z]2)?)$~i',请参阅regex101.com/r/6PBlmu/1 【参考方案1】:

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

~^(?: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

【讨论】:

【参考方案2】:

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

不过,这可能会有所改进。我不是正则专家。

Here's a live example

【讨论】:

【参考方案3】:

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

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

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

例如,我在一家名为 PCA Predict 的公司工作,我们的解决方案 a demo 正在实施中。这是一个用于在线结帐表格的插件,允许客户开始输入其地址的任何部分,并在他们选择其地址时自动填写这些字段。

我们还提供 REST API 以静默验证和返回地址。

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

【讨论】:

【参考方案4】:

我遇到了同样的问题,并且很难验证邮政编码,Royal Mail 添加和删除邮政编码非常频繁。所以在过去的两周里,我一直在构建一个地址数据库,并免费创建了一个看起来非常讨厌的 API,你可以验证邮政编码,它会返回该邮政编码的每个地址。​​

我希望这会有所帮助。

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

返回格式: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" 

【讨论】:

以上是关于验证英国邮政编码 - 短版和长版的主要内容,如果未能解决你的问题,请参考以下文章

我第一次设置 Haskell 开发环境的经验是常见的还是一次性的?

英国邮政编码验证器

验证英国短(向外)邮政编码

使用正则表达式验证英国邮政编码

英国邮政编码正则表达式验证

从英国邮政编码获取进出代码