我有一个包含不同标题的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兼容性与我无关。
提前谢谢!
答案 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)
您是否考虑将自由形式字符串的额外层剥离到列表项?也许有一个自动填充字段/下拉列表或类似;用户输入并重新选择两次相同的数据似乎过多。
我打算建议研究模糊搜索算法,但是如果有一个与特定标题匹配的值数组会更简单吗?它可以与标准化时期,大写和空格进行比较,即
Dr
,dr.
和Dr.
将进行规范化并与Dr.
匹配doctor
和Doctor
将进行规范化和匹配doc
,Doc.
和doc
将进行规范化和匹配等。这听起来像是一个令人头脑麻木的任务,虽然经历了各种错误等等。真的考虑首先将它变成标准化的下拉列表;唯一比这更难处理的是非标准化的地址字段:)