2009-04-28 28 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]); 
    } 
} 

但是,我可能错了。