2009-09-04 4 views
5

J'essaie de voir ce qui serait un bon moyen de valider une adresse américaine, je sais qu'il n'y a peut-être pas une bonne façon de le faire, mais je vais pour la base: #, Le nom de la rue, la ville, l'état et le code postal.PHP regexp Adresse américaine

Toutes les idées seront en mesure d'apprécier. Merci

+0

Quelle partie de l'adresse essayez-vous de valider avec un Regex? Le tout, le code postal? –

+0

comme je l'ai dit précédemment, j'essaie de voir si la chaîne commence par un nombre (n'importe quelle taille), suivi de lettres (nom de rue) & (ville), et deux lettres code d'état. –

+0

Le problème avec ce que vous venez de mentionner est que les adresses ne doivent pas commencer par un numéro (c'est-à-dire un Microsoft Way, boîtes postales) et le nom de la rue ne doit pas contenir de lettres (autoroutes, rues numérotées). – jimyi

Répondre

2

Il existe trop de variations d'adresse pour pouvoir le faire en utilisant des expressions régulières. Il est préférable de trouver un service Web pouvant valider les adresses. USPS has one - vous devrez demander la permission de l'utiliser.

+0

En fait, ce ne sont pas les variations, mais le fait qu'une adresse postale n'est pas régulière. Au moins, je ne le pense pas. Si quelqu'un peut prouver que c'est le cas, faites-le, je serais intéressé. –

4

N'essayez pas. Quelqu'un est susceptible d'avoir une boîte postale, ou un numéro d'appartement, etc., et ils seront vraiment en colère contre vous. Même un nom de rue "normal" peut avoir des numéros, comme 125th Street (et beaucoup d'autres) à New York City. Même une banlieue peut avoir quelques rues numérotées.

Et les noms de villes peuvent avoir des espaces.

+0

J'ai vécu dans une rue nommée "East South Boulder Road". Autrement dit, la partie est de la rue nommée "South Boulder Road". C'était très amusant d'expliquer aux gens qui demandaient mon adresse. –

+4

En Australie, il y a une * town * appelée 1770. Et pour vous répondre à la question suivante, non, le code postal est 4677. –

+0

http://en.wikipedia.org/wiki/1770,_Queensland –

4

Demandez à l'utilisateur d'entrer des parties de l'adresse dans des champs séparés (nom de rue, ville, état et code postal) et d'utiliser la validation appropriée pour un tel champ. C'est la pratique générale.

Alternativement, si vous voulez plus simple expression régulière qui correspond à quatre chaînes séparées par trois virgules, essayez ceci:

/^(.+),([^,]+),([^,]+),([^,]+)$/ 

Si correspondent les choses, vous pouvez utiliser motif supplémentaire correspondant pour vérifier les composants de l'adresse. Il n'y a aucun moyen de vérifier la validité de l'adresse de la rue, mais vous pourriez être en mesure de texter les codes postaux et les codes d'état.

0

Ce n'est pas une solution pare-balles mais l'hypothèse est qu'une adresse commence par un chiffre pour le numéro de rue et se termine par un code postal qui peut être soit 5 ou 9 chiffres.

([0-9] {1,} [\ s \ S] * [0-9] {5} (: -? [0-9] {4}))

Comme J'ai dit, ce n'est pas à l'épreuve des balles, mais je l'ai utilisé avec un succès marginal dans le passé.

0

ici en Nouvelle-Zélande, vous pouvez autoriser la liste officielle des adresses postales de New Zealand Post - vous donnant les données nécessaires pour remplir une table avec chaque adresse postale valide en Nouvelle-Zélande.

Validation contre cette liste est beaucoup plus facile que d'essayer de trouver une expression rationnelle - et la précision est beaucoup beaucoup plus aussi bien, que vous vous retrouvez avec trois cas:

  • L'adresse vous validez est dans la liste, donc vous savez que c'est une vraie adresse
  • L'adresse que vous validez est très similaire à celle de la liste, donc vous savez que c'est probablement une vraie adresse
  • L'adresse que vous validez La validation n'est pas similaire dans la liste, donc elle peut être réelle ou non.

Le mieux que vous obtiendrez avec un RegEx est

  • L'adresse que vous validons matchs la regex, donc il peut être une adresse réelle
  • L'adresse que vous validons ne correspondre à la regex, donc il pourrait ne pas être une véritable adresse

Négliger de connaître les adresses postales est une situation assez courante pour beaucoup d'entreprises, donc je crois que l'autorisation d'une liste sera possible dans la plupart des régions.

Le seul bit collant sera le prix.

2

Je suis d'accord avec salman : demander à l'utilisateur de saisir les données dans différents champs (un pour le zip, un pour l'état, un pour la ville et un pour le nom de rue.) Utiliser une expression rationnelle différente pour chaque champ Pour la rue #/nom la meilleure expression avec était

/^[0-9]{1,7} [a-zA-z0-9]{2,35}\a*/ 
+0

Est-ce que cette regex fonctionnerait avec des noms composés ou avec un ST/DR/AVE par la suite? Je pense à "1234 Old Statesville Rd" ou "123 Main ST". La partie du nom de la rue ne prend pas d'espaces. – rajah9