Php preg_match_all生成街道地址数组

Php preg_match_all生成街道地址数组,php,arrays,regex,preg-match,Php,Arrays,Regex,Preg Match,我需要将街道地址的部分捕获到php变量中。我对preg_match_all的大部分内容都很熟悉,但我需要一些关于regex部分的帮助: $address[0] = '2033 2nd Avenue, Seattle, WA 98121'; preg_match_all("/(\w*)+/", $address[0], $first_address); // get rid of the empty bits $first_address = array_filter(array_map('a

我需要将街道地址的部分捕获到php变量中。我对preg_match_all的大部分内容都很熟悉,但我需要一些关于regex部分的帮助:

$address[0] = '2033 2nd Avenue, Seattle, WA 98121';

preg_match_all("/(\w*)+/", $address[0], $first_address);

// get rid of the empty bits
$first_address = array_filter(array_map('array_filter',$first_address));

print_r($first_address)

// results
Array
(
    [0] => Array
        (
            [0] => 2033
            [2] => 2nd
            [4] => Avenue
            [7] => Seattle
            [10] => WA
            [12] => 98121
      )
  )
我可以使用类似于
$first\u address[0][4]
的语法很好地访问这些部分,但我不能依赖表示地址部分的数组号是相同的(有时省略逗号)

理想的情况是,如果我可以生成一个关联数组来命名零件:

Array
(
    [0] => Array
        (
            [hsn]    => 2033
            [street] => 2nd
            [suffix] => Avenue
            [city]   => Seattle
            [state]  => WA
            [zip]    => 98121
      )
  )

有人有更好的方法吗?

您需要一个复杂的解析器。例如,如果是
2033 West Second Avenue
,你需要做
street=>West Second
。那么
100 Avenue of the Americas,NY,NY
呢?是的,你可以使用关联数组,但我把你的东西看得很好。就你而言。explode(','$address[0])将非常好。简单且非常容易,我尝试过这个,但还没有完成解析器,它只适用于澳大利亚的街道地址,但确实有效。我发现的最简单的方法是点击带有地址的GoogleMapsAPI,它会很乐意地返回解析后的地址,但对于每天可以做的数量是有限制的。虽然解析地址相当简单,但要解释人类及其不一致性是一项艰巨的工作,实际上这是所有程序员所做的,要解释人类的愚蠢/懒惰。