选择中最接近的匹配

时间:2012-04-05 06:24:32

标签: javascript jquery regex levenshtein-distance

我有一个包含不同标题的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>

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

然而,我发现用户有时候很愚蠢。

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

我该怎么做?我只对MySQL的LIKE和PHP的levenshtein()进行了近似匹配,根据我的理解,这些都与JS相关。

jQuery 1.7.1可用。 IE6兼容性与我无关。

提前谢谢!

4 个答案:

答案 0 :(得分:2)

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

如果是这种情况,那么您可以简单地将用户字符串与select中的每个项目进行比较,并牢记以上内容:

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

答案 1 :(得分:2)

用户从不愚蠢;)

在你进行匹配之前,我会首先将我的所有字母变换为我的javascript中的lowecase,然后我会寻找点(。)和mabye删除它们或将它们添加到match-string(它是你的选择)。 / p>

答案 2 :(得分: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>

您的问题的另一个解决方案 - 向您的用户提供此表单,以便他们无法输入任何错误的数据。

答案 3 :(得分:0)

您是否考虑将自由形式字符串的额外层剥离到列表项?也许有一个自动填充字段/下拉列表或类似;用户输入并重新选择两次相同的数据似乎过多。

我打算建议研究模糊搜索算法,但是如果有一个与特定标题匹配的值数组会更简单吗?它可以与标准化时期,大写和空格进行比较,即

  • 用户输入的Drdr.Dr.将进行规范化并与Dr.匹配
  • 用户输入的doctorDoctor将进行规范化和匹配
  • 用户输入的docDoc.doc将进行规范化和匹配等。

这听起来像是一个令人头脑麻木的任务,虽然经历了各种错误等等。真的考虑首先将它变成标准化的下拉列表;唯一比这更难处理的是非标准化的地址字段:)