PHP: преобразовать строку города, штата, страны в соответствующий регистр заголовков - PullRequest
1 голос
/ 12 мая 2009

У меня есть строки города, штата, страны, такие как:

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

Я хотел бы преобразовать их в соответствующие им дела (Нью-Йорк, Нью-Йорк, США и т. Д.) Какой быстрый способ сделать это в PHP?

Ответы [ 4 ]

2 голосов
/ 12 мая 2009
$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 голос
/ 12 мая 2009

Что вы подразумеваете под «надлежащим случаем»? У меня такое чувство, что я что-то упускаю настолько, насколько вам нужно, поэтому было бы неплохо, если бы вы могли точно уточнить, что это за данные и как вы хотите их обработать.

Вы можете использовать ucfirst, чтобы сделать первую букву каждого слова заглавной, и вы можете использовать explode, чтобы разделить строку на соответствующие сегменты:

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

В приведенных вами примерах вам не нужно ничего делать для штатов и стран, хотя есть strtoupper, если вы хотите гарантировать, что они прописные.

Это сложное предложение, однако, поскольку я уверен, что есть ситуации, в которых любой вывод, который он дает, может не быть «правильным» способом написания конкретного города, хотя я не могу придумать ни одного примера из топа моей головы, я уверен, что есть некоторые.

Я также замечаю, что есть несколько строк, в которых есть страна («США»), а в некоторых есть только город («ГОНКОНГ») - нет надежного способа определить, что содержит строка. Вы можете попытаться сопоставить его со списком стран и городов и т. Д., Но кажется, что любое решение, которое вы придумали, в лучшем случае будет игрой в догадки.

0 голосов
/ 17 января 2011
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
// )
0 голосов
/ 12 мая 2009

Без словаря всегда будут некоторые крайние случаи, поэтому я думаю, что этот подход будет лучшим

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...