2012-01-02 8 views
15

мне нужно, чтобы соответствовать с использованием регулярных выражений в PHP адресов, как:preg_match PHP уличный адрес

  • 144 улица, город, почтовый/почтовый индекс
  • 144 улице, склонный # 1, город, почтовый/почтовый индекс
  • 144 улицы склонного # 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 
) 

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

Что можно сделать и для запятых?

+0

Он не будет работать ни с вашим '#' там. Можете ли вы быть более точным о том, какой вклад вы ожидаете, помимо примеров выше? – fge

ответ

15

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

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

Другая вещь, которую вам нужно будет проверить, является ли улица пространства в нем нравится:

1000 NW One Way Drive

ИЛИ

100 Rue Des Peupliers

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

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

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

-1

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

попробовать этот

+4

i get: PHP Предупреждение: preg_match(): Неизвестный модификатор '+' – Marty

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

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

0

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

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

+2

, который будет хорошо для США, а что же Canda? ВЕЛИКОБРИТАНИЯ? – aki

+0

Я думал, что ОП упомянул только адреса в стиле США, но я вижу, что он указал, что «zip» может содержать буквы, которые, я полагаю, делают его почтовым индексом более чем почтовым индексом. Тем не менее, это может помочь с хорошей частью его адресов. – ceejayoz

+0

жаль, что я не вижу «только адреса в стиле США» в вопросе – aki