【问题标题】:Extracting a zip code from an address string从地址字符串中提取邮政编码
【发布时间】:2014-01-31 05:25:49
【问题描述】:

我有一些完整的地址,例如:

$addr1 = "5285 KEYES DR  KALAMAZOO MI 49004 2613"
$addr2 = "PO BOX 35  COLFAX LA 71417 35"
$addr3 = "64938 MAGNOLIA LN APT B PINEVILLE LA 71360-9781"

我需要从字符串中取出 5 位数的邮政编码。我怎样才能做到这一点?也许使用正则表达式?

一个可接受的答案假设一个地址中可能有多个 5 位数字,但邮政编码始终是最后一个连续的 5 位数字。

我的想法是使用 explode 然后循环并检查每个索引。谁有更好的主意?

非常感谢任何帮助..

【问题讨论】:

  • 到目前为止您尝试过什么?这是一项相当简单的任务,也是学习正则表达式的好机会
  • 我的想法是使用explode然后循环并检查每个索引。

标签: php regex zipcode


【解决方案1】:

谈到美国的邮政编码,为了获得邮政编码,您可以使用以下正则表达式,前面跟两个字母的州代码:

/\b[A-Z]{2}\s+\d{5}(-\d{4})?\b/

解释:

\b         # word boundary
[A-Z]{2}   # two letter state code
\s+        # whitespace
\d{5}      # five digit zip
(-\d{4})?  # optional zip extension
\b         # word boundary

Online Example

在你的 PHP 中使用它:

$addr1 = "5285 KEYES DR  KALAMAZOO MI 49004 2613";
$addr2 = "PO BOX 35  COLFAX LA 71417 35";
$addr3 = "64938 MAGNOLIA LN APT B PINEVILLE LA 71360-9781";

function extract_zipcode($address) {
    $zipcode = preg_match("/\b[A-Z]{2}\s+\d{5}(-\d{4})?\b/", $address, $matches);
    return $matches[0];
}

echo extract_zipcode($addr1); // MI 49004
echo extract_zipcode($addr2); // LA 71417
echo extract_zipcode($addr3); // LA 71360-9781

Online Example

编辑 1:

为了扩展功能和灵活性,您可以指定是否保留状态代码:

function extract_zipcode($address, $remove_statecode = false) {
    $zipcode = preg_match("/\b[A-Z]{2}\s+\d{5}(-\d{4})?\b/", $address, $matches);
    return $remove_statecode ? preg_replace("/[^\d\-]/", "", extract_zipcode($matches[0])) : $matches[0];
}
 
    echo extract_zipcode($addr1, 1); // 49004 (without state code)
    echo extract_zipcode($addr2);    // LA 71417 (with state code)
 

Online Example

【讨论】:

  • 纽约 10024 失败
【解决方案2】:

好吧,这里的问题是,地址不一定要有 4 位数字的邮政编码。有些地址只有 4 位数字。假设您只有 5 位邮政编码地址,您当然可以使用正则表达式。

看看这里,也许这会对你有所帮助:

Regex Expression to Find 5-Digit Code

【讨论】:

    【解决方案3】:

    如果最后一个始终是邮政编码,并且它们都有 5 位数字,您可以使用以下内容:

    function getZipCode($address) {
        $ok = preg_match("/(\d\d\d\d\d)/", $address, $matches);
        if (!$ok) {
            // This address doesn't have a ZIP code
        }
        return $matches[count($matches] - 1];
    }
    

    【讨论】:

    • 这将导致$addr3 出现误报,并且可以稍微优化您当前状态的正则表达式。这个正则表达式可能会更好:[A-Z]{2} (\d{5})(虽然我不太了解美国地址系统)
    【解决方案4】:

    我会查找所有 4 位或 5 位数字并取最后一个匹配项。

    preg_match( $addr, '/(\d{4,5})/', $matches);
    $result = $matches[count($matches) - 1];
    

    【讨论】:

      【解决方案5】:

      好吧,这个正则表达式将返回最后一个连续的五位数字字符串。它使用负前瞻来确保返回后不存在 5 位字符串

      \b\d{5}\b(?!.*\b\d{5}\b)
      

      所以,也许:

      if (preg_match('/\b\d{5}\b(?!.*\b\d{5}\b)/', $subject, $regs)) {
              $result = $regs[0];
      } else {
          $result = "";
      }
      

      【讨论】:

        【解决方案6】:
        $addr = "U Square, The Park,  On NH-39,  Village- Kupa, Taluka- Bhiwandi,  District Thane 421101, test test, 454564";
        
        $zipcode = preg_match("/\b\d{6}\b/", $a, $matches); //It will return first occurance of 6 digit no. i.e. Indian pincode
        
        print_r($matches[0]);
        

        【讨论】:

        • 你永远不应该只把代码作为答案。解释总是非常受欢迎的。此外,你带来了什么其他人没有指出的东西?下次回答某人时,请记住所有这些。也就是说,我鼓励你继续帮助别人!干杯。
        【解决方案7】:
         var zipCode = vm.propertyAddress.match(/\d{5}(-\d{4})?\b/g);
        

        地址 : 8585 Summerdale rd Apt-175 SanDiego 92126 CA 结果:92126

        这也适用于只提供邮政编码的情况

        【讨论】:

          【解决方案8】:

          小心,parsing addresses is hard。许多这些答案做出了不稳定的假设:主要是,地址是一种常规语言。他们不是。

          除非保证您的(美国)地址采用特定的标准化格式(在这种情况下,正则表达式可能有效,仅适用于邮政编码),您可能想尝试 API比如LiveAddress(我在SmartyStreets 工作)。像这样的 API 将为您解析地址,返回组件,并验证它。 (顺便说一句,您提供的一些地址似乎无效,例如,USPS 无法识别它们。)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-02-21
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多