Первое предположение: только американские адреса.
Сначала выясните, являются ли последние 5 или последние 10 символов числовыми.Проще проверить, является ли последний символ числовым.Если это так, то, вероятно, он включает почтовый индекс.Затем простой тест, чтобы увидеть, содержит ли последние 10 пробел (city #####
) или последние десять содержат тире (12345-6789
), чтобы выяснить, является ли это 5 или 5 + 4 zip.Мы проверим на дефис и без пробела.(city-du-lac 12345
захватывает -lac 12345
)
Далее все адреса разделяют город и штат через запятую, поэтому нам нужна последняя запятая.Найдите индекс последней запятой и разделите ее там.Я не знаю города, который использует запятые в своем названии, и я уверен, что не позволю моему парсеру разразиться неизвестным, если я смогу помочь ему.Я игнорирую тот факт, что Washington DC
также может быть Washington, DC
.Я считаю, что крайние случаи предназначены для библиотек, а не для одного сценария.
Наконец, обрежьте все, что осталось, чтобы удалить конечные или начальные пробелы.
function IsNumeric(n) {
return !isNaN(parseFloat(n)) && isFinite(n);
}
var addr = 'New York City, New York 10101';
//var addr = 'San Bernadino, CA 11111';
function getCityStateZip(addr){
var city; var state;var zip;
city = ''; state = ''; zip = '';
var addrLen = addr.length;
if ( IsNumeric( addr.substring(addrLen - 1) ) ) {
//contains a zipcode - just a sanity check
//get last 10 characters for testing easily
var lastTen = addr.substring( addrLen - 10 );
if ( lastTen.indexOf('-') > 0 && ( lastTen.indexOf(' ') == -1 ) ) {
//found a hyphen and no space (matches our complex rule for zipcodes)
zip = lastTen;
} else {
zip = addr.substring( addrLen - 5 ); //assume a basic 5 zip code
}
}
var zipLen = zip.length;
addrLen = addrLen - zipLen - 1;
addr = addr.substring(0, addrLen ); //remove the chars we just moved into zip
var lastComma = addr.lastIndexOf(',');
if ( lastComma == -1 ) {
//you have a problem, how do you want to handle it?
}
city = addr.substring(0,lastComma); //skip the comma itself, yes?
state = addr.substring(lastComma + 2);
return { 'city':city,'state': state,'zip': zip};
}
getCityStateZip(addr)
IsNumeric
Функция js может быть найдена здесь Проверка десятичных чисел в JavaScript - IsNumeric ()