【问题标题】:preg_match php street addresspreg_match php 街道地址
【发布时间】:2012-01-02 12:32:18
【问题描述】:

我需要在 php 地址中使用正则表达式进行匹配,例如:

  • 144 street, city, state 邮政编码
  • 144 street, apt #1, city, state 邮政编码
  • 144 street apt #1, city state 邮政编码

邮政编码可以包含字母和/或数字。

这是我尝试过的:

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

它输出:

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

这只能使用空格。当我有一个逗号时它不起作用,它会导致一个空数组。

我该怎么做才能包含逗号?

【问题讨论】:

  • 那里的# 也不起作用。除了上面的示例之外,您能否更准确地了解您期望的输入?

标签: php preg-match


【解决方案1】:

为什么不简单地删除逗号,然后使用您的正则表达式?

对于字母数字邮政编码,您可能需要添加除a-z0-9 之外的其他字符,因为加拿大邮政编码使用空格。

您需要检查的另一件事是街道中是否有空间,例如:

1000 NW 单向车道

100 Rue Des Peupliers

您的正则表达式将不起作用。城市也一样。

使用 API 很好,但您必须为您需要的国家/地区获取 API。如果您想验证所有可能会很痛苦的国家/地区。

ceejayoz 有一个很好的答案,但我认为您应该做的是获取您获得的顶级国家/地区的 API,然后将正则表达式用于其他所有内容。

【讨论】:

    【解决方案2】:
    /^([0-9]+)\s([a-z]+)(,\s|\s)([a-z]+)(,\s|\s)([a-z]+)(,\s|\s)([a-z0-9]+)$/i
    

    只需将“\s”更改为“(,\s|\s)”,这将匹配空格或逗号和空白。除了 fge 提到的,你的表达还有很多问题。例如,考虑带有空格或连字符的街道或城市名称......

    【讨论】:

      【解决方案3】:

      美国邮政服务有一个标准化 API - https://www.usps.com/business/webtools.htm

      通过正则表达式执行此操作将是一个痛苦且有问题的过程。许多地址不遵循通常的格式。

      【讨论】:

      • 我以为 OP 只提到了美国式地址,但我看到他指定“zip”可以包含字母,我想这使它成为邮政编码而不是 zip。不过,这可能对他的大部分地址有所帮助。
      • 抱歉,我在问题中没有看到“仅美国式地址”
      • 哦,我知道了,我不知道它对我们来说是唯一的,我们在我的国家也使用 ZIP,感谢您提供这些信息(我的城镇 Calape,薄荷岛,邮政编码:6328)-en.wikipedia.org/wiki/Calape,_Bohol还有en.wikipedia.org/wiki/List_of_ZIP_codes_in_the_Philippines
      • 快速浏览一下维基百科就会发现,菲律宾也使用“邮政编码”——这可能是美国控制该国时的遗物。有趣的边缘案例。不过,看起来没有其他国家/地区。
      【解决方案4】:

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

      试试这个

      【讨论】:

      • 我得到:PHP 警告:preg_match():未知修饰符 '+'
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多