我想让用户输入标签:
windows linux“mac os x”
然后用空格分割它们,但也将“mac os x”识别为整个单词。
这可以将爆炸功能与其他功能结合起来吗?
必须有办法。
答案 0 :(得分:8)
我会要求用户输入分隔符号并用逗号分隔符爆炸:
$string = "windows, linux, mac os x";
$pieces = explode(',', $string);
无论如何,这是大多数标签系统的工作方式。
否则你需要构建一个解析器,因为explode无法处理你想要的东西。在我看来,正则表达式是一种矫枉过正。
答案 1 :(得分:2)
要么用户将其标记值与逗号分隔为Elzo Valugi建议,要么改进您的用户界面,以便用户一次输入一个标记(类似于Google Wave或Wordpress的标记用户界面)。我建议后者。
如果你真的想坚持你提出的输入格式(我不建议),你可以维护一个多字标签列表(那些不应该被拆分的标签)。将用户提供的组合标记字符串与此列表进行比较,并确保不拆分这些术语。如果您坚持使用这种方法,我可以更详细地讨论细节,但我不认为这是一个好主意,因为条目格式本身存在缺陷。
答案 2 :(得分: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));
答案 3 :(得分:0)
你可以做一个正则表达式。我不是最好的写作,但是这里的其他人应该能够匹配那些在没有引号的空格上打破它们的“单词”。
答案 4 :(得分:0)
当用户输入字符串"mac os x"
时,您可以自动检测空格并将字符串更改为"mac-os-x"
,然后您仍然可以通过这种方式进行爆炸:
$os = "metasys solaris mac-os-x";
$strings = explode(' ', $os);
您可以使用替换功能执行此操作。