Ho visto questa domanda molto quando ho lavorato per una società di verifica degli indirizzi. Sto pubblicando la risposta qui per renderla più accessibile ai programmatori che stanno cercando la stessa domanda. La compagnia in cui lavoravo miliardi di indirizzi e abbiamo imparato molto nel processo.
Innanzitutto, dobbiamo capire alcune cose sugli indirizzi.
Gli indirizzi non sono regolari
Ciò significa che le espressioni regolari sono fuori. Ho visto tutto, dalle semplici espressioni regolari che abbinano gli indirizzi in un formato molto specifico, a questo:
/ \ 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})? (tribunale | ct | via | st | auto | dr | corsia | ln | stradali | 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 | CN | ND | NE | NH | NJ | nm | NV | NY | OH | OK | O | PA | RI | SC | SD | TN | TX | UT | VA | VI | VT | WA | WI | WV | WY) ([\ s |, |.] +) (\ s + \ d {5}) ([\ s |, |.]? +) / i
... a ciò in cui un file di classe superiore a 900+ genera un'espressione regolare supermassiva al volo per abbinare ancora di più. Non li consiglio (ad esempio, ecco un violino della regex sopra, che fa molti errori ). Non esiste una formula magica facile per farlo funzionare. In teoria e in teoria, non è possibile abbinare indirizzi con un'espressione regolare.
La pubblicazione USPS 28 documenta i numerosi formati di indirizzi possibili, con tutte le loro parole chiave e variatori. Peggio ancora, gli indirizzi sono spesso ambigui. Le parole possono significare più di una cosa ("St" può essere "Saint" o "Street") e ci sono parole che sono abbastanza sicuro che abbiano inventato. (Chi sapeva che "Stravenue" era un suffisso stradale?)
Avresti bisogno di un codice che capisca davvero gli indirizzi, e se quel codice esiste, è un segreto commerciale. Ma probabilmente potresti farlo da solo se ti piace davvero.
Gli indirizzi sono disponibili in forme e dimensioni inaspettate
Ecco alcuni indirizzi inventati (ma completi):
1) 102 main street
Anytown, state
2) 400n 600e #2, 52173
3) p.o. #104 60203
Anche questi sono probabilmente validi:
4) 829 LKSDFJlkjsdflkjsdljf Bkpw 12345
5) 205 1105 14 90210
Ovviamente, questi non sono standardizzati. Punteggiatura e interruzioni di riga non garantite. Ecco cosa sta succedendo:
Il numero 1 è completo perché contiene un indirizzo e una città e uno stato. Con tali informazioni, è sufficiente identificare l'indirizzo e può essere considerato "consegnabile" (con una certa standardizzazione).
Il numero 2 è completo perché contiene anche un indirizzo (con numero secondario / unità) e un codice postale di 5 cifre, che è sufficiente per identificare un indirizzo.
Il numero 3 è un formato di casella postale completo, in quanto contiene un codice postale.
Il numero 4 è completo anche perché il codice postale è univoco , il che significa che un'entità privata o una società ha acquistato quello spazio degli indirizzi. Un codice postale unico è per gli spazi di consegna concentrati o ad alto volume. Qualsiasi cosa indirizzata al codice postale 12345 va alla General Electric di Schenectady, New York. Questo esempio non raggiungerà nessuno in particolare, ma l'USPS sarebbe comunque in grado di fornirlo.
Anche il numero 5 è completo, che ci crediate o no. Con solo quei numeri, l'indirizzo completo può essere scoperto quando analizzato su un database di tutti gli indirizzi possibili. Compilare i direzionali mancanti, il designatore secondario e il codice ZIP + 4 è banale quando vedi ogni numero come un componente. Ecco come appare, completamente espanso e standardizzato:
205 N 1105 W Apt 14
Beverly Hills CA 90210-5221
I dati dell'indirizzo non sono tuoi
Nella maggior parte dei paesi che forniscono dati di indirizzo ufficiali ai fornitori autorizzati, i dati di indirizzo stessi appartengono all'agenzia governativa. Negli Stati Uniti, USPS possiede gli indirizzi. Lo stesso vale per Canada Post, Royal Mail e altri, sebbene ogni paese imponga o definisca la proprietà in modo leggermente diverso. Sapere questo è importante, dal momento che solitamente proibisce il reverse engineering del database degli indirizzi. Devi stare attento a come acquisire, archiviare e utilizzare i dati.
Google Maps è una soluzione comune per le correzioni rapide degli indirizzi, ma il TOS è piuttosto proibitivo; ad esempio, non è possibile utilizzare i loro dati o API senza mostrare una mappa di Google e solo per scopi non commerciali (a meno che non si paghi) e non è possibile archiviare i dati (tranne per la memorizzazione temporanea nella cache). Ha senso. I dati di Google sono tra i migliori al mondo. Tuttavia, Google Maps non verifica l'indirizzo. Se un indirizzo non esiste, sarà ancora vi mostrerà dove l'indirizzo sarebbe stato se essa ha fatto exist (provarlo sulla propria strada, utilizzare un numero civico che si sa non esiste). Questo è utile a volte, ma attenzione.
La politica di utilizzo di Nominatim è allo stesso modo limitante, specialmente per volumi elevati e uso commerciale, e i dati sono per lo più estratti da fonti gratuite, quindi non sono così ben mantenuti (tale è la natura dei progetti aperti) - tuttavia, questo potrebbe comunque adattarsi I tuoi bisogni. È supportato da una grande comunità.
Lo stesso USPS ha un'API, ma scende molto e non ha garanzie né supporto. Potrebbe anche essere difficile da usare. Alcune persone lo usano con parsimonia senza problemi. Ma è facile perdere il fatto che USPS richiede di utilizzare la propria API solo per confermare gli indirizzi da spedire attraverso di essi.
Le persone si aspettano che gli indirizzi siano difficili
Sfortunatamente, abbiamo condizionato la nostra società ad aspettarsi che gli indirizzi fossero complicati. Ci sono dozzine di buoni articoli UX su Internet su questo, ma il fatto è che se hai un modulo di indirizzo con singoli campi, questo è ciò che gli utenti si aspettano, anche se rende più difficile per gli indirizzi edge-case che non si adattano al formattare il modulo è previsto, o forse il modulo richiede un campo che non dovrebbe. O gli utenti non sanno dove inserire una determinata parte del loro indirizzo.
In questi giorni potrei continuare a parlare della cattiva UX dei moduli di pagamento, ma invece dirò solo che combinare gli indirizzi in un singolo campo sarà un gradito cambiamento - le persone saranno in grado di digitare il loro indirizzo come meglio credono , piuttosto che cercare di capire la tua forma lunga. Tuttavia, questa modifica sarà inaspettata e all'inizio gli utenti potrebbero trovarla un po 'stonata. Basta essere consapevoli di ciò.
Parte di questo dolore può essere alleviato mettendo il campo di campagna in primo piano, prima dell'indirizzo. Quando compilano prima il campo Paese, sai come far apparire il tuo modulo. Forse hai un buon modo per gestire gli indirizzi degli Stati Uniti a campo singolo, quindi se selezionano gli Stati Uniti, puoi ridurre il modulo in un singolo campo, altrimenti mostra i campi dei componenti. Solo cose a cui pensare!
Ora sappiamo perché è difficile; cosa puoi fare al riguardo?
USPS concede in licenza ai fornitori tramite un processo chiamato certificazione CASS ™ per fornire indirizzi verificati ai clienti. Questi fornitori hanno accesso al database USPS, aggiornato mensilmente. Il loro software deve essere conforme a rigorosi standard per essere certificato, e spesso non richiedono un accordo su termini limitanti come discusso sopra.
Esistono molte aziende certificate CASS che possono elaborare elenchi o disporre di API: Melissa Data, Experian QAS e SmartyStreets per citarne alcuni.
(A causa del fatto che mi sono comportato male per la "pubblicità", ho troncato la mia risposta a questo punto. Sta a te trovare una soluzione che funzioni per te.)
La verità: davvero, gente, non lavoro in nessuna di queste aziende. Non è una pubblicità.