2012-01-02 14 views
15

ho bisogno di abbinare uso delle espressioni regolari negli indirizzi php come:preg_match indirizzo php strada

  • 144 via, città, stato zip/codice postale
  • 144 strada, apt # 1, città, stato zip/codice postale
  • 144 strada apt # 1, città stato zip/codice postale

Il codice postale/postale possono comprende lettere e/o numeri.

Ecco cosa ho provato:

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); 

emette:

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

questo funziona utilizzando solo gli spazi. Quando ho una virgola non funziona e risulta in una matrice vuota.

Cosa posso fare per includere anche le virgole?

+0

Non funziona con il tuo '#'. Puoi essere un po 'più preciso su quale input ti aspetti, a parte gli esempi sopra? – fge

risposta

15

Perché non rimuovere semplicemente la virgola e quindi utilizzare l'espressione regolare?

Anche per zip alfanumerica potrebbe essere necessario aggiungere altri caratteri oltre allo a-z0-9 poiché i codici postali canadesi utilizzano lo spazio.

L'altra cosa che dovrete verificare è se una strada è spazi in esso, come:

1000 NW Una strada carrabile

O

100 Rue Des Peupliers

L'espressione regolare non funzionerà. Lo stesso per City.

L'utilizzo di un'API è buono ma è necessario ottenere l'API per i paesi di cui si ha bisogno. Se vuoi convalidare tutto il paese che può essere doloroso.

ceejayoz ha una buona risposta, ma quello che penso che dovresti fare è ottenere l'API per i paesi migliori che ricevi e quindi usare la regex per tutto il resto.

-1

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

provare questo

+4

ottengo: PHP Attenzione: preg_match(): Modificatore sconosciuto '+' – Marty

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

basta cambiare "\ s" per "(, \ s | \ s)", che sarebbe partita sia uno spazio o una virgola e uno whtiespace. Tuttavia ci sono molti problemi con la tua espressione accanto a ciò che fge menzionato. Pensa a nomi di strade o città con spazi o trattini, ad esempio ...

0

Il servizio postale statunitense ha un'API di normalizzazione - https://www.usps.com/business/webtools.htm.

Fare questo tramite regex sarà un processo doloroso e glitch. Molti indirizzi non si attengono al solito formato.

+2

che andrà bene per gli Stati Uniti, che dire di Canda? UK? – aki

+0

Pensavo che l'OP menzionasse solo gli indirizzi in stile americano, ma vedo che ha specificato che "zip" può contenere lettere, che suppongo ne faccia un codice postale più di un zip. Tuttavia, questo può aiutare con buona parte dei suoi indirizzi. – ceejayoz

+0

scusate, non vedo "solo indirizzi in stile USA" nella Domanda – aki