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)*
попробуйте это