我有一些完整的地址,例如:
$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然后循环并检查每个索引。有人有更好的主意吗?
非常感谢任何帮助..
答案 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
$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
为了扩展功能和灵活性,您可以指定是否要保留州代码:
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)
答案 1 :(得分:0)
嗯,这里的问题是,地址不必有4位数的邮政编码。地址只有4位数。假设您只有5位数的邮政编码地址,当然可以使用RegEx。
看看这里,也许这会对你有帮助:
答案 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]);