从地址字符串中提取邮政编码

I w*_*ce. 6 php regex zipcode

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

$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"
Run Code Online (Sandbox Code Playgroud)

我需要从字符串中获取5位数的邮政编码.我怎样才能做到这一点?也许用RegEx?

可接受的答案假定地址中可能有多个5位数字,但Zip代码将始终是最后一个连续的5位数字.

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

任何帮助是极大的赞赏..

Ili*_*sev 11

说到美国邮政编码,预先附有两个字母的州代码,以获得邮政编码,您可以使用以下正则表达式:

/\b[A-Z]{2}\s+\d{5}(-\d{4})?\b/
Run Code Online (Sandbox Code Playgroud)

说明:

\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
Run Code Online (Sandbox Code Playgroud)

在线示例

在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
Run Code Online (Sandbox Code Playgroud)

在线示例

编辑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)
Run Code Online (Sandbox Code Playgroud)

在线示例