只获取英国邮政编码的第一部分


Get first part of UK postcode only

我正试图从一个可能只有邮政编码第一部分或完整邮政编码的字符串中获取英国邮政编码的第一部分。我正在努力使其工作。如果使用前瞻性输入完整的邮政编码,我就可以使用它,但我似乎不能使前瞻性成为可选的,所以如果只输入邮政编码的第一部分,它是匹配的。

到目前为止,我的正则表达式是([A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]([0-9ABEHMNPRV-Y])?)|[0-9][A-HJKPS-UW])(?=( ?[0-9][ABD-HJLNP-UW-Z]{2})))

我有几个必须匹配的邮政编码,这些是使用上面的regex:的结果

A10EA     - Should match and does
A1        - Should match but doesn't
A10 0EA   - Should match and does
A10       - Should match but doesn't
BH18 1AE  - Should match and does
BH18AE    - Should match and does
EC1M 6HJ  - Should match and does
EC1M      - Should match but doesn't
Z10 2EV   - Shouldn't match and doesn't
QE3 6DA   - Shouldn't match but matches E3 6DA

有人能帮我解决这个问题吗?

我一直工作的RegEx是邮局的官方网站:

/^(GIR ?0AA|[A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]([0-9ABEHMNPRV-Y])?)|[0-9][A-HJKPS-UW]) ?[0-9][ABD-HJLNP-UW-Z]{2})$/i

在任何人将其标记为PHP的副本之前,当可以输入完整或部分时,请查找英国邮政编码的第一部分,但事实并非如此。这个问题的答案不起作用,请参阅我对答案的评论。

根据这个wiki页面,邮政编码总是以"数字-字母-字母"结尾,这将是'd'w'w$的正则表达式模式。现在我们知道了如何发现结局,我们只想捕捉剩下的

('S*)'s*'d'w'w$这样的模式会起作用。这将捕获前半部分,并确保您不会得到最后一个"数字-字母-字母"部分。它将通过获取除空白以外的任何内容(仅包含字母和数字)来捕获第一部分。

为了充分解释这一点,括号()是我们正在捕捉的内容。'S表示"任何一个非空白字符,而'S*是我们所能得到的。"。所以('S*)会捕捉到一个空格字符的所有内容,但如果用户没有输入,它会捕捉到所有内容。我提供的完整正则表达式还将尝试捕获"任何空格、一个数字、两个字母、字符串结尾",这将确保AA999AA被拆分为AA999AA

不过,我刚刚注意到,你的问题表明,你可能实际上没有第二部分。我想你可以通过检查字符串长度来解决这个问题。如果修剪空白并且长度小于5个字符,则必须只有第一部分,因此不需要任何regex。


免责声明这不适用于Anguillan邮政编码。为了支持他们的邮政编码,我认为(''S*)''S*(?:''d''w''w|-''d{4})$会起作用

我一直在错误地看待这个问题。我想得到邮政编码的第一部分,如果有的话,删除第二部分,所以为什么不先验证邮政编码,然后检查末端,必要时去掉它。

我已经在验证邮政编码了,这是我已经有的代码:

$validate = Validation::factory(array('postcode' => $postcode));
$validate->rule('postcode', 'not_empty');
$validate->rule('postcode', 'regex', array(':value', '/^(GIR ?(0AA)?|[A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]([0-9ABEHMNPRV-Y])?)|[0-9][A-HJKPS-UW]) ?([0-9][ABD-HJLNP-UW-Z]{2})?)$/i'));
if ( ! $validate->check())
{
    $postcode = '';
}

所以现在我在它后面加了一个:

if ($postcode)
{
    $short_postcode = $postcode;
    // Check for an end section and then if present, remove it
    if (preg_match('/ ?([0-9])[ABD-HJLNP-UW-Z]{2})$/i', $postcode, $match, PREG_OFFSET_CAPTURE))
    {
        $short_postcode = substr($postcode, 0, $match[0][1]);
    }
}

这只剩下邮政编码的第一部分,这就是我想要的。此Eval.in显示它适用于我问题中的所有示例。