2014-02-22 40 views
0

我试图实现对字典的Web App的不对称的搜索,所以搜索ü,例如,将只返回实际包含ü令牌,但搜索 ü将返回üü。 (这样,不知道如何输入特殊字符的用户仍然可以搜索它们,但知道如何输入它们的用户不会被不必要的普通字符形式淹没。)不对称搜索在JavaScript中的特殊字符

它必须都是客户端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 

这不是优雅的,但它的工作原理。清理完两个字符串后,即使用户不知道如何输入ü,用户也可以搜索超级并获得超过。但如果他们知道如何,直接搜索直接返回的东西,如超级,这是我不想要的东西。

我已经想到了诸如为每个搜索词分别检查每个特殊字符或复制每个具有特殊字符以产生特殊字符和纯字符版本的字典条目的事情,但是我的所有想法会严重减慢搜索的处理时间。

任何想法,不胜感激。

+3

请务必声明里面的'cleaned'变量您函数与'var'关键字,如果你想它是私人的。 –

+1

不清理输入字符串,如果输入字符串中有特殊字符,请不要清理test_to_search – dandavis

+0

如何处理,而不是使用已清理的字典副本做某些事情,而是使用脏的副本?我的意思是,仍然搜索清理过的字典,但只能从脏的字符串中返回字符串。由于脏副本和干净副本应该仍具有相同的大小,并且在相同的位置上也将具有“相同”字符。这意味着搜索_uber_或_über_将返回_über_,并且搜索_über_只能**返回_über_ – enhzflep

回答

0

我最终检查查看搜索项是否包含任何特殊字符,如果是,我没有通过cleanup()运行它,并将其与原始字典条目而不是cleaned进行比较。感谢大家的评论。

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"); 
}