我正在尝试对字典网络应用实施非对称搜索,例如,搜索ü只返回实际包含ü的标记,但是搜索 u 将返回 u 和ü。 (这是因为不知道如何键入特殊字符的用户仍然可以搜索它们,但是知道如何键入它们的用户将不会被不必要的普通字符表单所淹没。)
它必须是没有任何外部库的客户端JavaScript。
我设法通过运行搜索词和我正在搜索以下函数的文本来使第二个搜索类型工作,有效地将特殊字符与它们的简单对应物合并:
function cleanUp(dirty) {
cleaned = dirty.replace(/[áàâãäāă]/ig,"a");
cleaned = cleaned.replace(/đ/ig,"d");
cleaned = cleaned.replace(/[éèêẽëēĕ]/ig,"e");
cleaned = cleaned.replace(/[íìîĩïīĭ]/ig,"i");
cleaned = cleaned.replace(/ñ/ig,"n");
cleaned = cleaned.replace(/[óòôõöōŏ]/ig,"o");
cleaned = cleaned.replace(/[úùûũüūŭ]/ig,"u");
return cleaned;
}
然后我比较字符串以获得我的结果:
var search_term = cleanup(search_input.value);
var text_to_search = cleanup(main_text);
if (text_to_search.indexOf(search_term) > -1) ... //do something
它不优雅,但它有效。清理完两个字符串后,即使用户不知道如何键入ü,用户也可以搜索 uber 并获取über。但如果他们确实知道如何,直接搜索über也会返回像 uber 这样的东西,这是我不想要的。
我已经考虑过为每个搜索词分别检查每个特殊字符或者复制每个具有特殊字符的字典条目来生成特殊字符和普通字符版本,但我的所有想法都会严重减慢了搜索的处理时间。
非常感谢任何想法。
答案 0 :(得分:1)
你发布的答案听起来很合理。
我想建议一种更清晰的方式(双关语)来编写你的cleanup()
函数和执行一系列字符串操作的类似函数:
function cleanUp(dirty) {
return dirty
.replace(/[áàâãäāă]/ig,"a")
.replace(/đ/ig,"d")
.replace(/[éèêẽëēĕ]/ig,"e")
.replace(/[íìîĩïīĭ]/ig,"i")
.replace(/ñ/ig,"n")
.replace(/[óòôõöōŏ]/ig,"o")
.replace(/[úùûũüūŭ]/ig,"u");
}
答案 1 :(得分:0)
我最终检查了搜索词是否包含任何特殊字符,如果是,我没有通过cleanup()
运行它,并将其与原始字典条目而不是{{1一个。感谢大家的评论。