2009-04-28 26 views
3

Remy Sharp's jQuery tag suggestion plugin的當前實現僅檢查標籤開頭的匹配項。例如,輸入「Photoshop」將不會返回名爲「Adobe Photoshop」的標籤。如何使用依賴變量的模式執行Javascript匹配?

默認情況下,搜索區分大小寫。我稍微修改了它修剪多餘的空間和忽略大小寫:

for (i = 0; i < tagsToSearch.length; i++) { 
    if (tagsToSearch[i].toLowerCase().indexOf(jQuery.trim(currentTag.tag.toLowerCase())) === 0) { 
     matches.push(tagsToSearch[i]); 
    } 
} 

我試圖做的就是再次修改這能夠返回「Adobe Photoshop的」,當用戶鍵入「Photoshop中」。我一直在使用match試過,但我似乎無法得到它的工作當一個變量出現在模式:

for (i = 0; i < tagsToSearch.length; i++) { 
    var ctag = jQuery.trim(currentTag.tag); 
    if (tagsToSearch[i].match("/" + ctag + "/i")) { // this never matches, presumably because of the variable 'ctag' 
     matches.push(tagsToSearch[i]); 
    } 
} 

什麼是執行以這種方式正則表達式搜索正確的語法?

回答

5

如果你想在JavaScript中動態地執行regex,你必須使用RegExp object。我相信,你的代碼看起來像這樣(沒有測試,不知道,但正確的總體思路):

for (i = 0; i < tagsToSearch.length; i++) { 
    var ctag = jQuery.trim(currentTag.tag); 
    var regex = new RegExp(ctag, "i") 
    if (tagsToSearch[i].match(regex)) { 
     matches.push(tagsToSearch[i]); 
    } 
} 
2

而不是

"/" + ctag + "/i" 

使用

new RegExp(ctag, "i") 
0

你也可以繼續使用indexOf,只需將您的=== 0改爲> = 0即可:

for (i = 0; i < tagsToSearch.length; i++) { 
    if (tagsToSearch[i].toLowerCase().indexOf(jQuery.trim(currentTag.tag.toLowerCase())) >= 0) { 
     matches.push(tagsToSearch[i]); 
    } 
} 

但是,我可能錯了。