PHP:将城市,州,国家/地区字符串转换为正确的标题案例

时间:2009-05-12 00:13:50

标签: php string

我有城市,州,国家字符串,如:

NEW YORK, NY, US
REDMOND, WA, US
US
HONG KONG
CALGARY, CA
E. SYRACUSE, NY, US

我想将它们改造成适当的情况(纽约,纽约,美国等)。什么是用PHP快速完成此操作的方法?

4 个答案:

答案 0 :(得分:2)

$locs = array(
  'NEW YORK, NY, US',
  'REDMOND, WA, US',
  'US',
  'HONG KONG',
  'CALGARY, CA',
  'E. SYRACUSE, NY, US',
);
foreach ($locs as &$loc) {
  $items = explode(',', $loc);
  if (strlen($items[0]) > 2) {
    $items[0] = ucwords($items[0]);
  }
  $loc = implode(',', $items);
}

答案 1 :(得分:1)

“正确的情况”是什么意思?我有一种感觉,我错过了你所需要的东西,所以如果你能确切地说明这些数据是什么以及你想如何处理它会很好。

您可以使用ucfirst将每个单词的第一个字母设为大写,然后您可以使用explode将字符串分隔为相应的细分:

$str = "NEW YORK, NY, US";
list($city, $state, $country) = explode(',', $str);
$city = ucfirst(strtolower($city));

在您给出的示例中,您不需要对州和国家/地区执行任何操作,但如果您希望保证它们是大写的,则会strtoupper

然而,这是一个棘手的主张,因为我确信在某些情况下,这给出的任何输出可能都不是写一个特定城市的“正确”方式,尽管我想不出任何一个例子。我肯定有一些。

我也注意到有几条线只有一个国家(“美国”)而有些只有一个城市(“香港”) - 没有可靠的方法来确定字符串包含的内容。您可以尝试将其与国家和城市列表等进行匹配,但似乎无论您采用何种解决方案,它都将成为最佳猜谜游戏。

答案 2 :(得分:0)

如果没有字典,总会有一些边缘情况,所以我认为这种方法是最好的

vinko@parrot:~$ cat cap.php
<?php

$list = "NEW YORK, NY, US
REDMOND, WA, US
US
HONG KONG
CALGARY, CA
E. SYRACUSE, NY, US";

$countries = array("HONG KONG", "US", "CA");
$states = array("NY","WA");

$list = split("\n",$list);

$out = "";
foreach ($list as $line) {
        list($first,$second,$third) = split(",",$line);

        //Here you check in a dictionary for country/state to
        //like this:

        if (!in_array($first,$countries) && !in_array($first,$states)) {
                $first = ucwords(strtolower($first));
        }
        if ($third) { $out.= $first.",".$second.",".$third; }
        else if ($second && !$third) { $out.= $first.",".$second; }
        else { $out.= $first; }
        $out.= "\n";
}
echo $out;
?>
vinko@parrot:~$ php cap.php
New York, NY, US
Redmond, WA, US
US
HONG KONG
Calgary, CA
E. Syracuse, NY, US

答案 3 :(得分:0)

function title_case($val) {
    return mb_convert_case($val[0], MB_CASE_TITLE, "UTF-8");
}

$locs = array(
  'NEW YORK, NY, US',
  'REDMOND, WA, US',
  'US',
  'HONG KONG',
  'CALGARY, CA',
  'E. SYRACUSE, NY, US',
);
foreach ($locs as &$loc) {
  $loc = preg_replace_callback( '/\b\w{3,}\b/', "title_case", $loc);
}
print_r($locs);

// Array
// (
//     [0] => New York, NY, US
//     [1] => Redmond, WA, US
//     [2] => US
//     [3] => Hong Kong
//     [4] => Calgary, CA
//     [5] => E. Syracuse, NY, US
// )