将字符串中的单词拆分为数组,而不破坏用双引号括起来的短语

问题描述 投票:0回答:5

我想让用户输入标签:

windows linux "mac os x"

然后用空格将它们分开,同时将“mac os x”识别为一个完整的单词。

是否可以将爆炸功能与其他功能结合起来?

php arrays string explode delimited
5个回答
8
投票

我会要求用户输入以逗号分隔的标签,并用逗号分隔符进行分解:

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

这就是大多数标签系统的工作方式。

否则你需要构造一个解析器,因为explode无法满足你想要的。在我看来,正则表达式是一种矫枉过正的行为。


2
投票

只要引号内不能有引号(例如不允许使用

"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));

2
投票

要么让用户按照 Elzo Valugi 的建议用逗号分隔标签值,要么改进 UI,以便用户一次输入一个标签(类似于 Google Wave 或 Wordpress 的标签 UI)。我建议后者。

如果您确实想坚持使用建议的条目格式(我不建议这样做),您可以维护一个多字标签列表(那些不应该拆分的标签)。将用户提供的组合标签字符串与此列表进行比较,并确保您没有拆分这些术语。如果您决定坚持使用这种方法,我可以详细说明,但我认为这不是一个好主意,因为条目格式本身就有缺陷。


0
投票

你可以做一个正则表达式。我不是最擅长写它们,但这里的其他人应该能够匹配在不在引号中的空格上打破它们的“单词”。


0
投票

当用户输入字符串

"mac os x"
时,您可以自动检测空格并将字符串更改为
"mac-os-x"
,然后您仍然可以这样爆炸:

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

您可以使用 replace 功能来完成此操作。

© www.soinside.com 2019 - 2024. All rights reserved.