如何构建像SO这样的标记系统?

时间:2010-02-10 23:38:30

标签: c# string

如何构建像SO这样的标记系统?

我在asp.net mvc网站上使用了一个独特的文本框来提交“标签”。

首先,我尝试用逗号“asp.net,c#,sql server”分割标签。 它有效,但如果用户忘记用逗号分隔标签,我就有问题要拆分该字符串。

“asp.net c#sql server”:sql server应该是单个标签,而不是两个“sql”+“server”。

此外我“不能”(他不应该关心这个......)要求用户使用“ - ”字符分隔标签的单词:“sql-server”

有人帮忙吗?

5 个答案:

答案 0 :(得分:9)

我可以想到一种(简单)方式允许用户在标记中包含任何字符。该解决方案是允许用户一次只输入一个标记。你可以有一个用户输入标签的文本框(现有标签的自动完成是一个明确的优点),完成输入时按回车键或按钮,输入的标签显示在应用标签列表的文本框下方。这些应用标签必须为每个标签设置一个按钮,以便用户可以删除标签。

创建帖子时,

Wordpress 具有类似的标记机制,但只需说明哪些字符分隔标记,就可以一次输入多个标记。要求分隔符并不是什么大问题,但如果您不想强制使用特定分隔符,则只需要限制用户一次输入单个标记。

image of wordpress's tag box

另一个想法(编辑)

我今天刚读完这篇文章:Tokenizing Control

答案 1 :(得分:6)

StackOverflow与用户错误输入标签的问题完全相同,例如,如果您输入了“字符串操作”而不是“字符串操作”。您刚刚将标记分隔符从空格更改为逗号。

根本问题仍然是一样的,所以解决方案也是一样的并不奇怪:

  1. 通过您网站上的方便帮助教育您的用户。
  2. 主持人帮助修复其他用户的错误,清理网站。
  3. 主持人还会在用户犯错时对他们进行培训,以便他们以后不会犯同样的错误。
  4. StackOverflow证明这个模型可以很好地工作。由于您自己指出的含糊不清,用于纠正用户错误的自动化解决方案有时会产生错误。这会让正在正确行事的人感到沮丧,只会被软件“修复”他们的标签所挫败。

答案 2 :(得分:5)

要么匹配现有标签的字符串,那么你可以使用带空格的标签(假设你首先搜索更大的标签,这样你就可以在搜索'sql'之前找到'sql server'。你可以让它更健壮通过仅允许使用现有标签,并且具有用于创建新标签的单独机制。这样,用户可以容易地创建具有空格的标签,因为在新标签框中输入的任何内容将是单个标签,如“sql server 2005”。 / p>

编辑:

或者,您可以在标签中使用一些特殊语法来创建新语法:

'sql,asp.net,[NEWTAG] sql server,c#'将使用现有标签'sql','asp.net','c#'并创建一个新标签'sql server'

/ EDIT

或者您在空格上拆分并且不允许带空格的标记

在你的例子中,你如何区分'sql server'(1标签)和'sql''server'(2个标签)?

如果你看SO标签是空格分隔的,那么一个标签是sql-server。

只要您在输入标签时向他们建议标签,我认为这不会是一个问题

答案 3 :(得分:2)

您可以尝试一种统计spelling correction方法:如果有一堆东西已经标记为“sql server”,那么它可以做出有根据的猜测。当然,有时会出错。

答案 4 :(得分:0)

我的建议:

首先,在前面,立即选择:您是否要允许带有名称空格的标签?选择其中一个,不要尝试用启发式预测来创建一些疯狂的混搭,关于用户是否意味着一件事。

要么:

sql server

总是意味着1个标签,或者总是意味着2.现在就选择你想要的东西。非此即彼。如果你应该选择不允许标签中的空格(这意味着它是2个标签),但你也想让用户用逗号分隔标签,例如:

sql,server

然后你可以处理用户输入一堆混合的标签,例如:

sql server,regular expressions,java c#

使用这样的代码:

string[] tags = Regex.Split(input, @"(,|\s)+");

哪能得到你:

tags[0]: sql
tags[1]: server
tags[2]: regular
tags[3]: expressions
tags[4]: java
tags[5]: c#