Отдельная строка с использованием массива - PullRequest
2 голосов
/ 29 ноября 2010

У меня есть строка с именем, за которым следует город.Как и John Smith Smithville.

, мне нужно разделить это на две переменные (name, town) или массив.,Каков наилучший способ разделить строку на две части, если в строке найдено название города?

$string = "John Smith Smithville";
$townlist = array("smithville", "janeville", "placeville");

if(contains($string,$townlist))
{
//separate into two variables

}

Ответы [ 3 ]

6 голосов
/ 29 ноября 2010

Для этого используется регулярное выражение.

  • Получить экранированную версию названий городов для регулярных выражений. Убедитесь, что ни в одном из ваших названий названий городов нет /, или мы не можем использовать array_map() (2-й аргумент preg_quote() - это разделитель).
  • Соедините их трубой |.
  • Строка строит и запускает регулярное выражение.
  • $matches будет иметь имя как 1 и город как 2 индексы.

PHP

$string = 'John Smith Smithville';
$townlist = array('smithville', 'janeville', 'placeville');

if (preg_match_all(
      '/^(.*)\s(' . implode('|', array_map('preg_quote', $townlist)) . ')$/i',
      $string,
      $matches
))
{
    var_dump($matches);
}

Работает!

выход

array(3) {
  [0]=>
  array(1) {
    [0]=>
    string(21) "John Smith Smithville"
  }
  [1]=>
  array(1) {
    [0]=>
    string(10) "John Smith"
  }
  [2]=>
  array(1) {
    [0]=>
    string(10) "Smithville"
  }
}
1 голос
/ 29 ноября 2010

Это делает трюк, я думаю

  • Для каждого элемента в списке, получить позицию в исходной строке
  • Если мы получим позицию, мы знаем, что она находится встрока
  • Создание массива первой части и второй части
  • Отрыв от цикла, поскольку мы нашли то, что нам нужно
  • Возвращаем значение
  • Возвращает пустой массив, если мы ничего не находим

Должен работать, сделал несколько тестов.

$string = "John Smith Smithville";
$townlist = array("smithville", "janeville", "placeville");

function stringSeperation($string, $list)
{
    $result = array();

    foreach($list as $item)
    {
        $pos = strrpos(strtolower($string), strtolower($item));
        if($pos !== false)
        {
            $result = array(trim(substr($string, 0, $pos)), trim(substr($string, $pos)));
            break;
        }
    }

    return $result;
}

var_dump(stringSeperation($string, $townlist));
0 голосов
/ 29 ноября 2010

Задумывались ли вы об «особых случаях», таких как: «Джон Смит, Нью-Йорк»? или «Нью-Йорк-Нью-Йорк» (имя может содержать пробел, а имя человека может совпадать с городом)

Я думаю, что более подходящее решение: для каждой строки str мы проверяем все названия города. Процедура проверки (псевдокод):

foreach str in strArray[]
  foreach city in cities

     tmp = Get the substring in the end of str, which equal the length of the "city"
     if (tmp == city) then {name = substring(str, 0, strlen(str) - strlen(tmp)); break;}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...