我有一个自动完成(jQuery),我想在其中突出显示用户输入中出现的下拉列表中的任何单词。用户输入:“圣水”,即使他们不是彼此相邻,也应该突出圣水和水。因此,输入多个单词应突出显示多个单词
我正在尝试使用正则表达式使文本变粗
_renderItem: function( ul, item ) {
var termWords = this.term.trim().split(" ").join("|"); //if multiple words, split into parts, join back with ors to use in regexp
var regex = new RegExp("({"+termWords+"[s]?}*)([\s\.,])","gi"); // convert to regex, make global and case insensitive
var currentLabel = item.label;
var currentLabel = currentLabel.replace(regex, "<b>$1</b>$2");
var itemHtml = '<a>'+ currentLabel + '</a>';
return $( "<li></li>" )
.data( "item.autocomplete", item )
.html(itemHtml)
.appendTo( ul );
}
如果输入“is language”,尝试输出,输出表达式变为
/({is|language[s]?}*)([s.,])/gi
但问题是,我输入的文字都没有匹配,因此没有突出显示。
以下是我正在尝试的内容:http://jsfiddle.net/8tD49/5/,请注意,它与我自己的ajax函数返回的结果不完全相同,如图中所示。
修改:
突出显示多个字符串的最终答案:
_renderItem: function( ul, item ) {
var termWords = this.term.trim().split(" ").join("|"); //if multiple words, split into parts, join back with ors
"(?:"+termWords+"[s]?)*"
var regex = new RegExp("((?:"+termWords+")s?)([\s.,])?","gi");
var currentLabel = item.label;
var currentLabel = currentLabel.replace(regex, "<b>$1</b>$2");
var itemHtml = '<a>'+ currentLabel + '</a>';
return $( "<li></li>" )
.data( "item.autocomplete", item )
.html(itemHtml)
.appendTo( ul );
}
答案 0 :(得分:1)
我相信你混淆了{}
和简单的括号。要匹配某个或其他内容,语法为something|other
。如果需要用非选择性括号括起来,则语法为
(?:is|language[s]?)*
但在这里,我不认为*
是必要的。你想要匹配几个单词的所有出现:你所要做的就是做一个匹配任何这些单词的正则表达式。 g
标志将负责重复任务。
您的完整正则表达式应该成为:
"/((?:"+termWords+")s?)([\s.,])?/gi"
...
/((?:is|language)s?))([s.,])?/gi
([.,]?)
部分(你为什么把它放在那里,顺便说一下?)似乎也有点限制性。您可以使用(\W?)
代替英语(\W
是非字母数字字符的缩写,即[^a-zA-Z0-9]
,这意味着它会捕获任何标点符号但会弄乱像journée
这样的字词
当你试图捕捉复数时,你可能要小心,在这个例子中,iss
也会被捕获......这部分可能需要更多思考!
答案 1 :(得分:1)
您需要使用字边界(\ b)
(\双\ C | \ blanguage \ b)中
这是正确的语言。上述正则表达式匹配是和语言。