JavaScript中特殊字符的不对称搜索
我试图实现一个字典web应用程序的非对称搜索,例如,搜索ü将只返回实际包含ü的标记,但搜索u将同时返回u和ü。(这样,不知道如何键入特殊字符的用户仍然可以搜索这些字符,但知道如何键入字符的用户不会被不必要的普通字符表单淹没。) 它必须是客户端JavaScript,而不需要任何外部库 我通过以下功能运行搜索词和正在搜索的文本,有效地将特殊字符与普通字符合并,从而实现了第二种搜索类型:JavaScript中特殊字符的不对称搜索,javascript,search,Javascript,Search,我试图实现一个字典web应用程序的非对称搜索,例如,搜索ü将只返回实际包含ü的标记,但搜索u将同时返回u和ü。(这样,不知道如何键入特殊字符的用户仍然可以搜索这些字符,但知道如何键入字符的用户不会被不必要的普通字符表单淹没。) 它必须是客户端JavaScript,而不需要任何外部库 我通过以下功能运行搜索词和正在搜索的文本,有效地将特殊字符与普通字符合并,从而实现了第二种搜索类型: function cleanUp(dirty) { cleaned = dirty.replace(/[á
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和getüber,即使他们不知道如何键入ü。但如果他们知道怎么做,直接搜索über也会返回像uber这样的东西,这是我不想要的
我已经考虑过一些事情,比如为每个搜索词分别检查每个特殊字符,或者复制每个具有特殊字符的词典条目,以生成特殊字符和纯字符版本,但我所有的想法都会严重减慢搜索的处理时间
非常感谢任何想法。我最后检查了搜索词是否包含任何特殊字符,如果包含,我没有通过
cleanup()
,将其与原始词典条目进行比较,而不是与清理后的条目进行比较。谢谢大家的评论。你发布的答案听起来很合理
我只想建议一种更简洁的方法(双关语)来编写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");
}
如果你想让它是私有的,请确保在你的函数中用var
关键字声明cleaned
变量。不要清理输入字符串,如果输入字符串中有特殊字符,不要清理test\u to\u search eitherHow,而不是用字典的清理副本做些什么,你用的是脏拷贝吗?我的意思是,仍然在清理过的字典中搜索,但只返回脏字典中的字符串。因为脏拷贝和干净拷贝应该仍然具有相同的大小,并且在相同的位置也将具有相同的字符。这意味着搜索uber或über将返回über,而搜索über只能返回über。另一种方法可以从输入字符串构建RegExp(),例如,将“hum”转换为/\bh[ùũūŭu]m\b/g,然后调用text_to_search.match(myRX)而不是每次都进行所有替换和操作文本搜索…if(myInput.match(dirty))skipthedictionarycleanup()