Javascript 替换文本而不是HTML标记?
我在JQuery中对自动完成进行文本匹配,方法是重载_renderItem方法,检查JSON对象中用户搜索的文本。找到它后,我将用一个span标记替换它,并使用一个“user\u highlight\u match”类 我正在进行多词搜索,所以“John Smi”将突出显示John,然后是Smi,搜索“John James Smi”将突出显示“John”和“Smi”。这样做的问题是,假设您搜索“johnlas”,它将开始与span标记的class属性匹配,如果它已经存在的话。我怎样才能避开这件事 编辑:这里有一些代码显示了我所说的内容:Javascript 替换文本而不是HTML标记?,javascript,regex,Javascript,Regex,我在JQuery中对自动完成进行文本匹配,方法是重载_renderItem方法,检查JSON对象中用户搜索的文本。找到它后,我将用一个span标记替换它,并使用一个“user\u highlight\u match”类 我正在进行多词搜索,所以“John Smi”将突出显示John,然后是Smi,搜索“John James Smi”将突出显示“John”和“Smi”。这样做的问题是,假设您搜索“johnlas”,它将开始与span标记的class属性匹配,如果它已经存在的话。我怎样才能避开这件事
renderItem = function(ul, item) {
li = $('<li>', id: item._id);
if this.term and not item.dialog
terms = this.term.split(' ');
for term in terms
re = new RegExp("("+term+")", 'i');
match = re.exec(item.name);
if match
item.name = item.name.replace re, "<span class=\"user_highlight_match\">+match[0]+</span>";
)
renderItem=功能(ul,项目){
li=$(“”,id:item.\u id);
如果此.term而不是item.dialog
术语=本术语拆分(“”);
用术语
re=新的RegExp(“(“+术语+”,“i”);
match=re.exec(item.name);
如果匹配
item.name=item.name.replace re,“+匹配[0]+”;
)
因此,第一个术语会很好地匹配,但每次之后,如果您在html标记中搜索任何内容,部分匹配将被替换为标记。因此,假设“las”上有匹配,它将变成:
<span c<span class="user_highlight_match">Last</span>s="user_highlight_match">Last</span>
Last
您必须搜索文本节点并将其替换为所需的html。请参阅以下问题:
编辑:这里是我答案的jQuery版本
函数searchHTML(searchString,htmlString){
var expr=new RegExp(searchString,“gi”);
var container=$(“”).html(htmlString);
var elements=container.find(“*”).andSelf();
var textNodes=elements.contents().not(elements);
textNodes.each(函数(){
var matches=this.nodeValue.match(expr);
如果(匹配){
var parts=this.nodeValue.split(expr);
对于(变量n=0;nfunction searchHTML(searchString, htmlString) {
var expr = new RegExp(searchString, "gi");
var container = $("<div>").html(htmlString);
var elements = container.find("*").andSelf();
var textNodes = elements.contents().not(elements);
textNodes.each(function() {
var matches = this.nodeValue.match(expr);
if (matches) {
var parts = this.nodeValue.split(expr);
for (var n = 0; n < parts.length; n++) {
if (n) {
$("<span>").text(matches[n - 1]).insertBefore(this);
}
if (parts[n]) {
$(document.createTextNode(parts[n])).insertBefore(this);
}
}
$(this).remove();
}
});
return container.html();
}