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

时间:2014-01-12 12:51:36

标签: 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"

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

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

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

非常感谢任何帮助..

8 个答案:

答案 0 :(得分:10)

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

/\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

答案 1 :(得分:0)

嗯,这里的问题是,地址不必有4位数的邮政编码。地址只有4位数。假设您只有5位数的邮政编码地址,当然可以使用RegEx。

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

Regex Expression to Find 5-Digit Code

答案 2 :(得分:0)

如果最后一个始终是邮政编码并且它们都有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];
}

答案 3 :(得分:0)

我会查找4位或5位数字的所有数字并进行最后一场比赛。

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

答案 4 :(得分:0)

好吧,这个正则表达式将返回最后一个连续的五位数字符串。它使用负向前瞻以确保在返回一个字符串后缺少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 = "";
}

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

 var zipCode = vm.propertyAddress.match(/\d{5}(-\d{4})?\b/g);

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

如果仅提供Zipcode,这也适用

答案 7 :(得分:0)

$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]);