2014-02-22 42 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"); 
}