2012-04-05 101 views
2

我有一个select元素包含不同的标题;作为一个例子:最接近的匹配

<select name="titles"> 
    <option value="1">Mr.</option> 
    <option value="2">Mrs.</option> 
    <option value="3">Ms.</option> 
    <option value="4">Dr.</option> 
    [..] 
</select> 

然后我有一个字符串,其中包含用户提交的标题(最初写在自由格式的文本框中)。我的任务是在与该标题相对应的select中选择option

但是,我发现用户有时是愚蠢的。

我搜索的用户提供的字符串可能是“dr”。或“博士”或类似的东西。我需要将它与最相关的一个(即“博士”而不是“先生”,他们两个都接近说,“博士”)相匹配。

我该怎么办?我只做过与MySQL的LIKE和PHP的levenshtein()近似匹配,根据我的理解,这两者在JS中都很相关。

jQuery 1.7.1可用。 IE6兼容性不关心我。

预先感谢您!

+0

你想要一种自动完成功能吗? – Ved 2012-04-05 06:28:33

+0

不,我从数据库源中获取字符串,并且需要在页面加载后更改所选选项的方法。 – 2012-04-05 06:31:09

回答

2

如果我没有弄错,唯一合理的(和可以接受的)变化是开头的大写字母/没有大写字母,最后是缺失的字符。

如果是这样的话,那么你可以将用户的字符串简单地比较各个项目在select在考虑以上:

  • 转换用户输入的第一个字符为大写。
  • 如果用户字符串未以.结尾,请在该字符串的末尾添加.
  • 将修改的用户字符串与select中的每个元素进行比较,看看是否匹配。
+0

这肯定会适用于我列出的例子(并且我很尴尬,这种简单的事情没有发生在我身上),但麻烦到达了一些像威廉等待者那样的“Lt. Cmdr。”,“LCpl。”, “环保部”。这些(和其他一些)将会有更多的替代拼写。 – 2012-04-05 06:39:25

+2

对于那些类型的例子(Lt. Cmdr。等),您可能需要将每个选项的每个变体放在''。 – 2012-04-05 06:54:44

2

用户是从来没有愚蠢;)

在你做匹配我会先改变我的所有字母在我的JavaScript来lowecase,那我就去找点()和mabye删除或。将它们添加到你的匹配字符串(它的你的选择)。

1

希望有所帮助。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" 
    "http://www.w3.org/TR/html4/strict.dtd"> 

<html lang="en"> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
    <script type="text/javascript" charset="utf-8" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script> 
    <!-- Date: 2012-04-05 --> 
    <script type="text/javascript" charset="utf-8"> 
    $(document).ready(function() { 
     var title = "dr" 
     $("#titles option").each(function(i, el) { 
      var re = new RegExp(title, 'ig') 
      if ($(el).html().match(re)) { 
       $(el).attr("selected", "selected"); 
      } 
     }); 
    }) 
    </script> 
</head> 
<body> 
    <select name="titles" id="titles"> 
     <option value="1">Mr.</option> 
     <option value="2">Mrs.</option> 
     <option value="3">Ms.</option> 
     <option value="4">Dr.</option> 
    </select> 
</body> 
</html> 

而您的问题的另一种解决方案 - 给您的用户准确的表单,以便他们没有机会输入任何错误的数据。

+0

否则很好,但它也会将'selected'添加到“Cmdr”。和“Lt. Cmdr。”,由于匹配“博士”。任何修补程序? – 2012-04-05 07:32:28

+0

是的,用这个替换正则表达式:'var re = new RegExp(“^”+ title +“。* $”,'i')' – deadrunk 2012-04-05 10:40:06

+0

谢谢!尽管如此,那么这个人是不是也会遇到那些没有一段时间的标题呢?像“MEP”,“Sir”,“DA”等? – 2012-04-05 15:24:49

0

你会考虑剥离与自由格式字符串匹配到列表项的额外层吗?也许有自动填充字段/下拉或类似;似乎过度让用户输入并重新选择相同的数据两次。

我打算建议寻找一个模糊搜索算法,但是如果有一个匹配特定标题的值数组不会更简单吗?它可能比正常化的时期,大写和空格,即

  • 用户输入Drdr.Dr.将被标准化和反对匹配Dr.
  • 用户输入doctorDoctor将标准化和匹配
  • 用户输入docDoc.doc将被归一化匹配等

这听起来像一个令人头脑麻木的任务尽管经历了各种各样的错误等真的考虑首先将其制作为规范化的下拉菜单;唯一比这更难处理的将是一个非标准化的地址字段:)

+1

非常同意。可悲的是,我无法控制原始输入(用户生成的标题在其他地方收集,保存到数据库中,然后我尝试自动选择用户的东西以减轻填写冗长表单的工作量) – 2012-04-05 07:11:34

+0

那么这就是一个耻辱,但肯定会让最终用户填写表单变得更容易。另外:虽然这可能是和可能是过度杀伤只有标题匹配,这里是我所说的模糊搜索页面的链接:http://code.google.com/p/yeti-witch/一旦算法是最终确定,也许会帮助代码:) – 2012-04-05 07:15:41

+0

我完全没有问题,用于处理微小细节的过度代码。 80%的代码占用了20%的功能。 :) - 感谢您的链接,我会检查出来! – 2012-04-05 07:20:18