У меня есть полные адреса, например:
$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-значных чисел, но Zip-код всегда будет последним последовательным 5-значным номером.
Моя идея заключалась в том, чтобы использовать explode, затем прокручивать и проверять каждый индекс. Кто-нибудь получил лучшую идею?
Любая помощь приветствуется.
Говоря о почтовых кодах США, которые предварительно заполняются кодом состояния двух букв, чтобы получить почтовый код, вы можете использовать следующее регулярное выражение:
/\b[AZ]{2}\s+\d{5}(-\d{4})?\b/
Объяснение:
\b # word boundary [AZ]{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[AZ]{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[AZ]{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)
Интернет-пример
Я бы посмотрел все цифры с 4 или 5 цифрами и взял последний матч.
preg_match( $addr, '/(\d{4,5})/', $matches); $result = $matches[count($matches) - 1];
Ну, проблема здесь, адрес не должен иметь почтовый индекс с 4 цифрами. Имеются адреса только с 4 цифрами. Предполагая, что у вас есть только 5-значный почтовый индекс, вы можете использовать RegEx, конечно.
Посмотрите здесь, может быть, это поможет вам:
Выражение выражений для поиска 5-значного кода
Если последний всегда является почтовым индексом, и все они имеют 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]; }
Ну, это регулярное выражение вернет последнюю последовательную пятизначную строку. Он использует отрицательный внешний вид, чтобы обеспечить отсутствие 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 = ""; }
Тщательно, парсинг адресов трудно . Многие из этих ответов делают неустойчивые предположения: главным образом, эти адреса являются обычным языком. Они не.
Если ваши (US) адреса не гарантированы в определенном стандартизованном формате (в этом случае регулярное выражение может работать только для почтового индекса), вы можете попробовать использовать API как LiveAddress (я работаю на SmartyStreets). Подобные API будут анализировать адрес для вас, возвращать компоненты, а также проверять его. (Кстати, похоже, что некоторые из указанных вами адресов недействительны, например, USPS не распознает их.)
var zipCode = vm.propertyAddress.match (/ \ d {5} (- \ d {4})? \ b / g);
Адрес: 8585 Summerdale rd Apt-175 SanDiego 92126 CA Результат: 92126
Это также будет работать, если предоставляется только Zipcode