Php 是否有将美国位置字符串转换为单个零件的最佳实践?

Php 是否有将美国位置字符串转换为单个零件的最佳实践?,php,algorithm,location,string-parsing,Php,Algorithm,Location,String Parsing,是否有最佳实践或通用算法来实现位置(仅限美国)的自然搜索字符串到其单独组件的转换 例如: City Name, ST 00000 TO city => City Name state => ST zipcode => 00000 这是一个表单,所以我不需要处理任何可能的排列-我可以将格式限制为:city,st 00000,但我需要能够处理格式中任何段的省略,以便它们在某种程度上是可选的。。。支持的组合的一些示例(不区分大小写): 我还可以使用一组静态的状态缩写,以便在需要

是否有最佳实践或通用算法来实现位置(仅限美国)的自然搜索字符串到其单独组件的转换

例如:

City Name, ST 00000

TO

city => City Name
state => ST
zipcode => 00000
这是一个表单,所以我不需要处理任何可能的排列-我可以将格式限制为:
city,st 00000
,但我需要能够处理格式中任何段的省略,以便它们在某种程度上是可选的。。。支持的组合的一些示例(不区分大小写):

我还可以使用一组静态的状态缩写,以便在需要时可以匹配这些缩写来验证状态段。


<?php
    function uslocation($string)
    {
            // Fill it with states
        $states = array('D.C.', 'D.C', 'DC', 'TX', 'CA', 'ST');

        // Extract state
        $state = '';
        foreach($states as $st)
        {
            $statepos = strpos(' '.$string, $st);
            if($statepos > 0)
            {
                $state = substr($string, $statepos-1, strlen($st));
                $string = substr_replace($string, '', $statepos-1, strlen($st));
            }
        }

        if(preg_match('/([\d\-]+)/', $string, $zipcode))
        {
            $zipcode = $zipcode[1];
            $string = str_replace($zipcode, '', $string);
        }
        else
        {
            $zipcode = '';
        }

        return array(
            'city' => trim(str_replace(',', '', $string)),
            'state' => $state,
            'zipcode' => $zipcode,
        );
    }

    // Some tests
    $check = array(
        'Washington D.C.',
        'City Name TX',
        'City Name, TX',
        'City Name, ST, 0000',
        'NY 7445',
        'TX 23423',
    );

    echo '<pre>';
    foreach($check as $chk)
    {
        echo $chk . ": \n";
        print_r(uslocation($chk));
        echo "\n";
    }
    echo '</pre>';
?>

当我在研究时,我发现在我等待时使用的另一个代码中引用了一些其他代码。。。我在这里修改了代码,以支持获取zipcode和城邦:

其他人可能也会觉得有用


@德尔菲斯特:谢谢。一旦我有时间比较准确性和性能,我可能会切换到您的代码,如果它更好-当然更简单/更短!如果我真的这么做了,我会把它标记为正式答案。

当我在研究时,我在另一个代码中发现了一些其他代码,我在等待时使用了这些代码。。。我在这里修改了代码,以支持获取zipcode和城邦:

其他人可能也会觉得有用


@德尔菲斯特:谢谢。一旦我有时间比较准确性和性能,我可能会切换到您的代码,如果它更好-当然更简单/更短!如果我这样做,我会把它作为正式答案。

退后!我知道正则表达式!如果您希望这是通用的,我会将它发送到像谷歌地图这样的位置API。@glowcoder:哈哈哈。。。无价的尽管这似乎是一件很平常的事。现在我没有实现地理空间搜索(当我使用api时),我只需要将字符串(从单个表单字段)拆分为潜在值,以便快速搜索数据库…退后!我知道正则表达式!如果您希望这是通用的,我会将它发送到像谷歌地图这样的位置API。@glowcoder:哈哈哈。。。无价的尽管这似乎是一件很平常的事。现在我没有实现地理空间搜索(当我使用api时),我只需要将字符串(从单个表单字段)拆分为潜在值,以便快速搜索数据库…这可能会起作用。。。但我想我宁愿打它多次,这样我就可以处理任何组合(除非你有一些疯狂的正则表达式可以一次性处理,哈)。这会稍微慢一点,但我认为没有什么不可接受的。如果你带一些组合的例子,我可以帮你。状态总是两个字符?(加利福尼亚州、德克萨斯州、犹他州)?这可能有效。。。但我想我宁愿打它多次,这样我就可以处理任何组合(除非你有一些疯狂的正则表达式可以一次性处理,哈)。这会稍微慢一点,但我认为没有什么不可接受的。如果你带一些组合的例子,我可以帮你。状态总是两个字符?(加州、德克萨斯州、犹他州)?
<?php
    function uslocation($string)
    {
            // Fill it with states
        $states = array('D.C.', 'D.C', 'DC', 'TX', 'CA', 'ST');

        // Extract state
        $state = '';
        foreach($states as $st)
        {
            $statepos = strpos(' '.$string, $st);
            if($statepos > 0)
            {
                $state = substr($string, $statepos-1, strlen($st));
                $string = substr_replace($string, '', $statepos-1, strlen($st));
            }
        }

        if(preg_match('/([\d\-]+)/', $string, $zipcode))
        {
            $zipcode = $zipcode[1];
            $string = str_replace($zipcode, '', $string);
        }
        else
        {
            $zipcode = '';
        }

        return array(
            'city' => trim(str_replace(',', '', $string)),
            'state' => $state,
            'zipcode' => $zipcode,
        );
    }

    // Some tests
    $check = array(
        'Washington D.C.',
        'City Name TX',
        'City Name, TX',
        'City Name, ST, 0000',
        'NY 7445',
        'TX 23423',
    );

    echo '<pre>';
    foreach($check as $chk)
    {
        echo $chk . ": \n";
        print_r(uslocation($chk));
        echo "\n";
    }
    echo '</pre>';
?>