Javascript 替换文本而不是HTML标记?

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属性匹配,如果它已经存在的话。我怎样才能避开这件事

我在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;n我无法理解您的问题。请发布一些代码。添加了代码!如果您还需要,请告诉我。因为这些是不属于DOM的JSON对象,我将如何遍历节点?这正是我链接到的问题中的场景。您必须解析HTML-不要尝试编写自己的HTML解析器,让浏览器解析。如果你愿意,我可以复制并粘贴这个问题的答案。;-)我同意,编写我自己的古怪HTML解析器是个坏主意。你说服了我!@gilly3如何用另一个字符串替换搜索字符串?假设我想用伦敦替换西班牙?
    function 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();
    }