Попробуйте это регулярное выражение:
/([^,]+),\s*(\w{2})\s*(\d{5}(?:-\d{4})?)/
Переведено в код:
$str = "New York, NY 50805-2578";
preg_match("/([^,]+),\s*(\w{2})\s*(\d{5}(?:-\d{4})?)/", $str, $matches);
list($arr['addr'], $arr['city'], $arr['state'], $arr['zip']) = $matches;
print_r($arr);
Дает:
Array
(
[zip] => 50805-2578
[state] => NY
[city] => New York
[addr] => New York, NY 50805-2578
)
С этим регулярным выражением:
Существует некоторая проверка ввода (например: требуется, чтобы ввод был в форме: XXXXXXX, YY NNNNN-NNNN)
Пробелы необязательны
Последние 4 цифры почтового индекса являются необязательными