PHP可以在输入完整或部分时查找英国邮政编码的第一部分

时间:2013-05-03 12:58:19

标签: php

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

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

我的邮政编码查询只需要邮政编码的第一部分,我试图找到修剪字符串的最有效方法,只有第一部分,而不明确知道输入的格式。

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

这表明可能存在多少种可能的变化。确保我始终获得邮政编码的第一部分的最佳方法是什么?

5 个答案:

答案 0 :(得分: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>";
}

这比正则表达式更快,更简单。

答案 1 :(得分:3)

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

暂时忽略BFPO地址,试试:

if (preg_match("(([A-Z]{1,2}[0-9]{1,2})($|[ 0-9]))", trim($postcode), $match)) {
   $region=$match[1];
}

答案 2 :(得分:1)

如果你取出空间并检查长度,怎么办?我认为所有邮政编码必须至少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;
   }
}

答案 3 :(得分: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;
}

我认为无论如何都不能处理输入有效的外部邮政编码部分且只有部分向内部分的不太可能的情况。

答案 4 :(得分: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;
?>