2015-01-13 58 views
0

我試圖寫一個搜索功能,允許用戶輸入以下標準之一返回'胡志明市'。對我來說棘手的事情是,它必須始終搜索任何詞的開始。除此之外,它還必須與其他語言一起工作,但是如果我能得到拉丁字符,那至少是一個開始。javascript詞搜索帶有或沒有空格從詞的開頭

   //ho chi minh city 
       //hochiminhcity 
       //chi minh 
       //chiminh 
       //chiminhcity 
       //chi minh city 
       //ho 
       //chi 
       //minh 
       //city 

      containsTerm: function containsTerm (needle, haystack) { 

       var _this = LocationPickerCtrl, 
        ndl = _this.formatStr(stringHelper.escapeRegExp(needle)), 
        re = new RegExp('(?:^|\\s)' + ndl, 'gi'), 
        found = false, 
        len, 
        key = _this.formatStr(haystack.Key), 
        name = _this.formatStr(haystack.Name); 

       //check airport code 
       if (key.indexOf(ndl) > -1) { 
        found = true; 
       } 

       //start of word 
       if (re.test(name)) { 
        found = true; 
       } 

       if (name.indexOf(' ') > -1) { 

        if (name.replace(/\s/g, '').indexOf(needle) === 0) { 
         found = true; 
        } 

       } 

return found 

} 

任何幫助將不勝感激。先謝謝你!

+0

我已經更新了評論向你展示寫作的功能,我認爲對我來說更容易分解它 – user3299613

回答

0

沒在,你需要一個正則表達式:(

var words = ['ho', 'chi', 'minh', 'city']; 

var hochiming = function hochiming(words, input) { 

    var data = input; 
    var match = false; 

    for (var i = 0; i < words.length; i++) { 
    if (data.length === 0) { 
     return match; 
    } else if (data.substring(0, words[i].length) === words[i]) { 
     match = true; 
     data = data.substring(words[i].length); 
     if (data[0] === " ") { 
     data = data.substring(1); 
     } 
    } else if (match) { 
     return false; 
    } 
    } 
    return match; 
} 

var data = ['hochiminhcity', 'chi minh', 'chiminh', 'chiminhcity', 'chi minh city', 'ho', 'chi', 'minh', 'city']; 
data.forEach(function(entry) { 
    console.log('result:', hochiming(words, entry)); 
}); 

console.log('mistakes:'); 
(['ho chi minh ci', 'm aezfam', 'hochimineahcity', ' minhchi']).forEach(function(entry) { 
    console.log('result:', hochiming(words, entry)); 
}); 
0

如果你正則表達式的路線,也可能是這樣做一次見 -

# /(?=[hcm])(?:(?:ho)?\s*chi\s*minh(?:\s*city)?|(?:ho|chi|minh|city))/ 

(?= [hcm])       # Start at a 'h', 'c', or 'm' 
(?: 
     (?: ho)?        # Optional 'ho' 
     \s* chi \s* minh      # Must have 'chi minh' 
     (?: \s* city)?      # Optional 'city' 
    |          # or, 
     (?: ho | chi | minh | city)   # One of either 'ho','chi','minh', or 'city' 
)