2015-11-20 171 views
0

我想将地址拆分为城市,州和邮政编码。使用正则表达式分割美国的地址PHP

现在用我现在的正则表达式模式,我可以得到邮政编码和状态,但我在匹配城市时遇到了麻烦。

这是我目前的格局

/\s*([^,]+?)\s*((?:\w{2,3}|(AVE))[A-Z]+?(?:\s[A-Z]+)?)\s*(\w{2})\s*(\d{5}(?:-\d{4})|\d{5}(?:-\s\d{4})?)/ 

演示:https://regex101.com/r/kQ2dE7/1

通过上面我的演示,我能够在城市正确匹配,但是,这并不适用与其他类型的地址。

https://regex101.com/r/kQ2dE7/2

https://regex101.com/r/kQ2dE7/4

我希望第一个捕获组只匹配,直到有数字或仅数字或文字像ST,CT,AVE,DR一个字一个字。

例如:

11111甲BAY RD AAA111阳光岛海滩FL 33160-4266

11111甲BAY RD AAA111

阳光岛海滩

FL

33160-4266

第一个匹配组应检查它是否包含“ST”/“CT”/“DR”/“AVE”或带有数字的单词。然后它会匹配到这个词。

此外,如果字符串中有该单词的两个实例,那么它应该匹配,直到最远的单词​​。

实施例:

111 11TH ST AAAA2 BROOKLYN NY 11209- 4940

111 11TH ST AAAA2

BROOKLYN

NY

11209- 4940

(这个例子中,ST与数词存在,那么它应该匹配直到数字。)

这就是为什么我想创建一个条件语句,在我正则表达式匹配某些词。如何在正则表达式中实现?

+1

这是一个傻瓜的差事,尤其是如果你接受用户输入。如果你可以更清楚地陈述你需要的正则表达式,可能有人会想出一个,但它永远不会可靠地工作。有太多的排列。 – miken32

回答

0
  • 替代AVE是组(?:\w{2,3}|(AVE))在没用,因为AVE已经由\w{2,3}匹配。
  • (?:\w{2,3}|(AVE))在第二个捕获组中无效 - 它只匹配城市的2或3个第一个字符;但城市名称应该从单词边界开始,所以让我们用\b替换此组。
  • 空间分隔的城市名的后端部分可能出现多于一次(如在SUNNY ISLES BEACH,所以组(?:\s[A-Z]+)必须具有量词*而非?
  • (\d{5}(?:-\d{4})|\d{5}(?:-\s\d{4})?)可以简化为(\d{5}(?:-\s?\d{4})?)
  • 第一个匹配组应检查它是否包含“ST”/“CT”/ “DR”/“AVE”或带有数字的单词,然后它将匹配到该单词

    如果有两个实例那个工作d在一个字符串中,那么它应该匹配直到最远的单词​​。

    我认为你的意思是以上实例。第一捕获组([^,]+\b(?:ST|CT|DR|AVE|\w*\d\w*)\b)将满足这些要求。

上述所有的变化都纳入到你的正则表达式在这里:https://regex101.com/r/uY7oM1/4

\s*([^,]+\b(?:ST|CT|DR|AVE|\w*\d\w*)\b)\s*(\b[A-Z]+?(?:\s[A-Z]+)*)\s*(\w{2})\s*(\d{5}(?:-\s?\d{4})?)