Preg_match php street address

Мне нужно сопоставить регулярное выражение в php-адресах, например:

  • 144 улица, город, штат почтовый индекс/почтовый индекс
  • 144 street, apt # 1, city, state zip/почтовый индекс
  • 144 street apt # 1, городское почтовое индекс/почтовый индекс

Почтовый индекс может содержать буквы и/или номера.

Вот что я пробовал:

print_r(preg_match('/^([0-9]+)\s([a-z]+)\s([a-z]+)\s([a-z]+)\s([a-z0-9]+)$/i', $t, $m));
print_r($m);

выводится:

Array
(
    [0] => 123 asd asd asd 123
    [1] => 123
    [2] => street
    [3] => city
    [4] => state 
    [5] => zip
)

Это работает только с использованием пробелов. Когда у меня есть запятая, это не работает, и в результате получается пустой массив.

Что я могу сделать, включая запятые?

Ответы

Ответ 1

Почему бы просто не удалить запятую, а затем использовать регулярное выражение?

Также для буквенно-цифрового почтового индекса вам может потребоваться добавить другие символы, кроме a-z0-9, поскольку канадские почтовые индексы используют пробел.

Еще одна вещь, которую вам нужно проверить, - это если у улицы есть пробелы, например:

1000 односторонний накопитель NW

ИЛИ

100 Rue Des Peupliers

Ваше регулярное выражение не будет работать. То же самое для City.

Использование API - это хорошо, но вы должны получить API для стран, в которых вы нуждаетесь. Если вы хотите проверить всю страну, которая может быть болезненной.

ceejayoz имеет хороший ответ, но то, что я думаю, вам нужно сделать, это получить API для лучших стран, которые вы получаете, а затем использовать регулярное выражение для всего остального.

Ответ 2

/^([0-9]+)\s([a-z]+)(,\s|\s)([a-z]+)(,\s|\s)([a-z]+)(,\s|\s)([a-z0-9]+)$/i

Просто измените "\ s" на "(,\s |\s)", который будет соответствовать пробелу или запятой и whitespace. Тем не менее есть много проблем с вашим выражением рядом с тем, что упомянуто fge. Подумайте о названиях улиц или городов с пробелами или дефисами, например...

Ответ 3

Почтовая служба США имеет API нормализации - https://www.usps.com/business/webtools.htm.

Выполнение этого с помощью регулярного выражения будет болезненным, глючным процессом. Многие адреса не придерживаются обычного формата.

Ответ 4

[0-9]+\s(\w)*(\W)(\s?)(\w)*(\W)(#[0-9])?(\W*)(\w)*(\W)(\s?)(\w)*(\s?)(\w)*

попробуйте это