仅获取英国邮政编码的第一部分
Get first part of UK postcode only
我正在尝试从可能只有 post 代码的第一部分或完整 post 代码的字符串中获取英国 post 代码的第一部分在里面。我正在努力让它发挥作用。如果使用前瞻输入完整的 post 代码,我就可以正常工作,但我似乎无法使前瞻成为可选的,所以如果只有 [=26= 的第一部分]输入的代码是匹配的。
到目前为止我的正则表达式是 ([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})))
我有几个必须匹配的 post 代码,这些是使用上述正则表达式的结果:
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
有人可以帮我解决这个问题吗?
我一直使用的正则表达式是 post 办公室的官方正则表达式:
/^(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 Find first part of UK postcode when full or part can be entered 的副本之前,事实并非如此。该问题的答案无效,请参阅我对答案的评论。
根据 this wiki page,post 代码总是以 'digit letter letter' 结尾,这将是 \d\w\w$
的正则表达式模式。现在我们知道如何发现终点是什么了,我们只想捕捉剩下的部分。
(\S*)\s*\d\w\w$
这样的模式会起作用。这将捕获前半部分,并确保您不会获得最后的“数字字母部分”。它将通过获取非白色的任何内容来捕获第一部分 space,即仅字母和数字。
为了充分说明这一点,括号 ()
是我们要捕获的内容。 \S
说'任何一个非白人 space 字符,\S*
是我们所能得到的。所以 (\S*)
会捕获 space 字符之前的所有内容,但如果用户未输入字符,则会捕获所有内容。我提供的完整正则表达式还将尝试捕获 'any white space, one digit, two letters, end of string',这将确保将 AA999AA
拆分为 AA99
和 9AA
.
我也刚刚注意到,尽管您的问题表明您实际上可能没有第二部分。我认为您可以通过检查字符串长度来解决这个问题。如果你 trim 白色 space 并且长度小于 5 个字符,你必须只有第一部分,所以不需要任何正则表达式。
免责声明 这不适用于安圭拉 post 代码。为了也支持他们的 post 代码,我认为 (\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]);
}
}
这让我只剩下邮政编码的第一部分,这正是我想要的。 This Eval.in 显示它适用于我问题中的所有示例。
我正在尝试从可能只有 post 代码的第一部分或完整 post 代码的字符串中获取英国 post 代码的第一部分在里面。我正在努力让它发挥作用。如果使用前瞻输入完整的 post 代码,我就可以正常工作,但我似乎无法使前瞻成为可选的,所以如果只有 [=26= 的第一部分]输入的代码是匹配的。
到目前为止我的正则表达式是 ([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})))
我有几个必须匹配的 post 代码,这些是使用上述正则表达式的结果:
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
有人可以帮我解决这个问题吗?
我一直使用的正则表达式是 post 办公室的官方正则表达式:
/^(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 Find first part of UK postcode when full or part can be entered 的副本之前,事实并非如此。该问题的答案无效,请参阅我对答案的评论。
根据 this wiki page,post 代码总是以 'digit letter letter' 结尾,这将是 \d\w\w$
的正则表达式模式。现在我们知道如何发现终点是什么了,我们只想捕捉剩下的部分。
(\S*)\s*\d\w\w$
这样的模式会起作用。这将捕获前半部分,并确保您不会获得最后的“数字字母部分”。它将通过获取非白色的任何内容来捕获第一部分 space,即仅字母和数字。
为了充分说明这一点,括号 ()
是我们要捕获的内容。 \S
说'任何一个非白人 space 字符,\S*
是我们所能得到的。所以 (\S*)
会捕获 space 字符之前的所有内容,但如果用户未输入字符,则会捕获所有内容。我提供的完整正则表达式还将尝试捕获 'any white space, one digit, two letters, end of string',这将确保将 AA999AA
拆分为 AA99
和 9AA
.
我也刚刚注意到,尽管您的问题表明您实际上可能没有第二部分。我认为您可以通过检查字符串长度来解决这个问题。如果你 trim 白色 space 并且长度小于 5 个字符,你必须只有第一部分,所以不需要任何正则表达式。
免责声明 这不适用于安圭拉 post 代码。为了也支持他们的 post 代码,我认为 (\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]);
}
}
这让我只剩下邮政编码的第一部分,这正是我想要的。 This Eval.in 显示它适用于我问题中的所有示例。