4

有人请让我摆脱痛苦并帮助我解决这个问题。

我有一个邮政编码查找框,允许人们输入完整的邮政编码(例如 BS34 5GF)或部分邮政编码(例如 BS34)。

我的邮政编码查找只需要邮政编码的第一部分,并且我试图找到将字符串修剪为仅包含第一部分的最有效方法,而无需明确知道输入的格式。

以下是一些示例代码:B2 5GG、B22 5GG、BS22 5GG、B25GG、BS25GG、BS225GG、B2、BS2、BS22

这显示了可能有多少种可能的变化。确保我总是得到邮政编码的第一部分的最佳方法是什么?

4

5 回答 5

4

恕我直言,正则表达式正是该问题的正确解决方案。

暂时忽略 BFPO 地址,尝试:

if (preg_match("(([A-Z]{1,2}[0-9]{1,2})($|[ 0-9]))", trim($postcode), $match)) {
   $region=$match[1];
}
于 2013-05-03T15:27:17.283 回答
3

如果您使用正则表达式来匹配英国邮政编码(部分或全部),那么您做错了。另外,在继续之前请注意,无论您如何编写代码,都有一种情况会导致格式不明确:BS22 很可能属于 BS2 2AB 或 BS22 5GS。绝对没有办法告诉你,你需要根据它做出决定。

我建议的算法将 BS22 的情况视为 BS22。如下:

<?php
function testPostcode($mypostcode) {
if (($posOfSpace = stripos($mypostcode," ")) !== false) return substr($mypostcode,0,$posOfSpace);
    // Deal with the format BS000
    if (strlen($mypostcode) < 5) return $mypostcode;

    $shortened = substr($mypostcode,0,5);
    if ((string)(int)substr($shortened,4,1) === (string)substr($shortened,4,1)) {
       // BS000. Strip one and return
       return substr($shortened,0,4);
    }
    else {
      if ((string)(int)substr($shortened,3,1) === (string)substr($shortened,3,1)) {
         return substr($shortened,0,3);
      }
      else return substr($shortened,0,2);
    }
}

// Test cases
$postcodes = array("BS3 3PL", "BS28BS","BS34","BS345","BS32EQ");
foreach ($postcodes as $k => $v) {
   echo "<p>".$v." => ".testPostcode($v)."</p>";
}

这比正则表达式维护起来更快更简单。

于 2013-05-03T14:01:19.283 回答
2

如果您取出空格并检查长度怎么办。我认为所有邮政编码必须至少有 5 个字符长。

如果邮编少于 5 个字符,则将整个地区作为区号。如果大于5个字符,去掉最后3个字符,取余数作为区号:

function getPostCodeArea($pcode){
   $pcode = str_replace(' ', '', $pcode);
   if(strlen($pcode) > 4){
      if(is_numeric($pcode{strlen($pcode)-1})){
        $pcode = substr($pcode, 0, 4);
      }else{
        $pcode = substr($pcode, 0, strlen($pcode)-3);
      }
      return $pcode;
   }else{
      return $pcode;
   }
}
于 2013-05-03T14:02:21.137 回答
1

这将完成这项工作:

注意:这是一个简化的邮政编码正则表达式 - 有更好的用于更全面地验证

function getOutwardPostcodePart($postcode) {

    $matches = array();

    if (preg_match("/^([a-zA-Z]{1,2}[0-9][0-9A-Za-z]{0,1}) {0,1}([0-9][A-Za-z]{2}){0,1}$/", $postcode, $matches )) {

        return $matches[1];
    } 

    return false;
}

我认为无论如何都无法处理这种不太可能的情况,即输入有效的外部邮政编码部分而只有部分内部部分。

于 2013-05-03T15:45:03.663 回答
1

我发现这个版本适合我,它适合大写和小写条目以及伦敦市中心的邮政编码格式:

<?php
    $postcode = "BA12 1AB";
    if (preg_match("(([A-Za-z]{1,2}[0-9]{1,2})($|[ 0-9]))", trim($postcode), $match)) {     //  Caters for BA12 1AB and B1 2AB postcode formats
        $region=$match[1];
    } elseif (preg_match("(([A-Za-z]{1,2}[0-9]{1,2}[A-Za-z]{1})($|[ 0-9]))", trim($postcode), $match)) {        //  Caters for EC1M 1AB London postcode formats
        $region=$match[1];
    } else {
        $region="UK";
    }
    echo $region;
?>
于 2018-10-26T07:28:24.873 回答