Вопрос

Я хочу, чтобы пользователь вводил теги:

Windows Linux «Mac OS X»

а затем разделите их пробелами, но также распознаете «mac os x» как целое слово.

Можно ли для этого объединить функцию разнесения с другими функциями?

Должен быть способ.

Это было полезно?

Решение

Пока в кавычках не может быть кавычек (например. "foo\"bar" не разрешено), вы можете сделать это с помощью регулярного выражения.В противном случае вам понадобится полноценный парсер.

Это должно сделать:

function split_words($input) {
  $matches = array();
  if (preg_match_all('/("([^"]+)")|(\w+)/', $input, $reg)) {
    for ($ii=0,$cc=count($reg[0]); $ii < $cc; ++$ii) {
      $matches[] = $reg[2][$ii] ? $reg[2][$ii] : $reg[3][$ii];
    }
  }
  return $matches;
}

Использование:

$input = 'windows linux "mac os x"';
var_dump(split_words($input));

Другие советы

Я бы попросил пользователя ввести теги, разделенные запятыми, и взорвать их разделителем-запятой:

$string = "windows, linux, mac os x";
$pieces = explode(',', $string);

В любом случае именно так работает большинство систем тегов.

в противном случае вам придется создать синтаксический анализатор, потому что взрыв не сможет справиться с тем, что вы хотите.На мой взгляд, Regex - это излишество.

Либо попросите пользователя разделить значения тегов запятыми, как Эльзо Валуги предложено или улучшите свой пользовательский интерфейс, чтобы пользователи вводили один тег за раз (аналогично Google Wave или пользовательскому интерфейсу тегов Wordpress).Я предлагаю позже.

Если вы действительно хотите придерживаться предложенного формата записи (чего я не предлагаю), вы можете сохранить список тегов, состоящих из нескольких слов (тех, которые не должны разделяться).Сравните объединенную строку тега, предоставленную пользователем, с этим списком и убедитесь, что вы не разделяете эти термины.Если вы настроены придерживаться этого метода, я мог бы вдаваться в подробности, но я не думаю, что это хорошая идея, поскольку сам формат записи несовершенен.

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

Когда пользователь вводит строку "mac os x" вы можете автоматически обнаружить пробел и перейти к строке, чтобы "mac-os-x" тогда вы все равно можете взорваться таким образом:

$os = "metasys solaris mac-os-x";
$strings = explode(' ', $os);

Вы можете сделать это, используя заменять функция.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top