Це питання я багато бачив, коли працював у компанії, що підтверджує адресу. Тут я публікую відповідь, щоб зробити її більш доступною для програмістів, які шукають навколо з тим же запитанням. Компанія, в якій я переробляла мільярди адрес, і ми багато чого дізналися в процесі.
Спочатку нам потрібно зрозуміти кілька речей щодо адрес.
Це означає, що регулярні вирази відсутні. Я бачив це все, від простих регулярних виразів, які відповідають адресам у дуже конкретному форматі, до цього:
/ \ s + (\ d {2,5} \ s +) (?! [a | p] m \ b) (([a-zA-Z | \ s +] {1,5}) {1,2}) ? ([\ s |, |.] +)? (([a-zA-Z | \ s +] {1,30}) {1,4}) (суд | ct | вулиця | st | drive | dr | | | смуга | ln | дорога | rd | blvd) ([\ s |, |. |;] +)? (([a-zA-Z | \ s +] {1,30}) {1,2}) ([ \ s |, |.] +)? \ b (AK | AL | AR | AZ | CA | CO | CT | DC | DE | FL | GA | GU | HI | IA | ID | IL | IN | KS | KY | LA | MA | MD | ME | MI | MN | MO | MS | MT | NC | ND | NE | NH | NJ | NM | NV | NY | OH | OK | OR | OR | PA | RI | SC | SD | TN | TN | TX | UT | VA | VI | VT | WA | WI | WV | WY) ([\ s |, |.] +)? (\ S + \ d {5})? ([\ S |, |.]] +) / я
... до цього, коли файл 900-класового рядка з лінійкою генерує надмасивний регулярний вираз на льоту, щоб збігатися ще більше. Я не рекомендую їх (наприклад, ось загадка вищезгаданого регексу, яка робить багато помилок ). Не існує простої магічної формули, щоб змусити це працювати. У теорії і по теорії, це не представляється можливим , щоб відповідати адреси з регулярним виразом.
Публікація USPS 28 документує безліч можливих форматів адрес із усіма їх ключовими словами та варіантами. Найгірше, що адреси часто неоднозначні. Слова можуть означати більше ніж одне ("St" може бути "Saint" або "Street"), і є слова, які я впевнений, що вони вигадали. (Хто знав, що "Stravenue" - це вуличний суфікс?)
Вам знадобиться код, який дійсно розуміє адреси, і якщо цей код існує, це комерційна таємниця. Але ти, мабуть, можеш закатати своє, якщо ти справді займаєшся цим.
Адреси бувають несподіваних форм і розмірів
Ось кілька надуманих (але повних) адрес:
1) 102 main street
Anytown, state
2) 400n 600e #2, 52173
3) p.o. #104 60203
Навіть такі можливі:
4) 829 LKSDFJlkjsdflkjsdljf Bkpw 12345
5) 205 1105 14 90210
Очевидно, що вони не стандартизовані. Значення пунктуації та перерив рядків не гарантується. Ось що відбувається:
Номер 1 є повним, оскільки містить адресу вулиці та місто та штат. З цією інформацією достатньо ідентифікувати адресу, і її можна вважати "доставною" (з деякою стандартизацією).
Номер 2 є повним, оскільки він також містить адресу вулиці (із вторинним / одиничним номером) та 5-значний поштовий індекс, якого достатньо для ідентифікації адреси.
Номер 3 - це повний формат поштової скриньки, оскільки містить поштовий індекс.
Число 4 також є повним, оскільки поштовий індекс унікальний , це означає, що приватне підприємство чи корпорація придбали цей адресний простір. Унікальний поштовий індекс призначений для великих об'ємів або сконцентрованих місць доставки. Все, що адресовано поштовому індексу 12345, йде до General Electric у місті Шенектаді, штат Нью-Йорк. Цей приклад не охопить когось зокрема, але USPS все одно зможе його надати.
Число 5 також повне, вірите чи ні. За допомогою лише цих цифр повну адресу можна виявити, якщо проаналізувати базу даних усіх можливих адрес. Заповнення пропущених напрямків, вторинного позначення та коду ZIP + 4 тривіально, коли ви бачите кожне число як компонент. Ось як це виглядає, повністю розширений та стандартизований:
205 N 1105 Вт 14 січня
Беверлі-Хіллз Каліфорнія 90210-5221
Дані адреси не є вашими власними
У більшості країн, які надають офіційні дані адреси ліцензованим постачальникам, самі дані адреси належать керівному агентству. У США адресам належить USPS. Те саме стосується Canada Post, Royal Mail та інших, хоча кожна країна застосовує або визначає право власності дещо по-різному. Знання цього важливе, оскільки зазвичай забороняє зворотну інженерію бази даних адрес. Ви повинні бути обережними, як отримувати, зберігати та використовувати дані.
Карти Google - це звичайна можливість швидкого виправлення адреси, але TOS досить заборонений; наприклад, ви не можете використовувати їх дані чи API, не показуючи карту Google, і лише для комерційних цілей (якщо ви не платите) і не можете зберігати дані (крім тимчасового кешування). Має сенс. Дані Google є одними з найкращих у світі. Однак Карти Google не підтверджують адресу. Якщо адреса не існує, він ще покаже вам , де адреса буде , якщо він зробив існує (спробувати на власній вулиці, використовуйте номер будинку , який ви знаєте , не існує). Іноді це корисно, але пам’ятайте про це.
Політика використання Nominatim аналогічно обмежує, особливо для великого обсягу та комерційного використання, і дані здебільшого беруться з безкоштовних джерел, тому вони не так добре підтримуються (така природа відкритих проектів) - однак, це все одно може відповідати ваші потреби. Його підтримує велика громада.
У самій USPS є API, але він значно знижується і не має гарантій та підтримки. Це також може бути важким у використанні. Деякі люди користуються нею помірно і без проблем. Але легко пропустити, що USPS вимагає, щоб ви використовували їх API лише для підтвердження адрес для доставки через них.
Люди очікують, що адреси будуть важкими
На жаль, ми зумовили наше суспільство очікувати складності адрес. У всьому Інтернеті про це є десятки хороших статей про UX, але факт полягає в тому, що якщо у вас є адресна форма з окремими полями, це очікують користувачі, хоча це ускладнює отримання кращих адрес, які не відповідають Формат очікується, або, можливо, форма вимагає поля, яке воно не повинно. Або користувачі не знають, куди слід вказати певну частину своєї адреси.
Я можу продовжувати і продовжувати розповідати про погані форми UX для оформлення замовлення в наші дні, але замість цього я просто скажу, що об'єднання адрес в одне поле буде бажаною зміною - люди зможуть ввести свою адресу, як вони вважають за потрібне , а не намагатися з'ясувати вашу тривалу форму. Однак ця зміна стане несподіваною, і користувачі можуть спочатку знайти її трохи неприємними. Просто пам’ятайте про це.
Частину цього болю можна полегшити, поставивши поле країни перед адресою. Коли вони спочатку заповнюють поле країни, ви знаєте, як зробити свою форму. Можливо, у вас є хороший спосіб розібратися з однопольовими американськими адресами, тому якщо вони вибрали Сполучені Штати, ви можете звести форму до одного поля, інакше покажіть поля компонентів. Просто речі, над якими потрібно думати!
Тепер ми знаємо, чому це важко; що ти можеш з цим зробити?
USPS ліцензує виробників через процес під назвою CASS ™ Certification для надання підтверджених адрес клієнтам. Ці постачальники мають доступ до бази даних USPS, що оновлюється щомісяця. Їх програмне забезпечення повинно відповідати жорстким стандартам, які підлягають сертифікації, і вони часто не вимагають згоди з такими обмежувальними умовами, як обговорювалося вище.
Існує багато компаній, сертифікованих CASS, які можуть обробляти списки або мати API: Melissa Data, Experian QAS і SmartyStreets.
(Через те, що ви отримаєте негативну інформацію про "рекламу", я відповів усією своєю відповіддю. Зараз ви вирішуєте знайти рішення, яке працює для вас.)
Правда: Дійсно, люди, я не працюю ні в одній із цих компаній. Це не реклама.