JavaScript RegExp匹配忽略HTML的文本

是否有可能在“< strong>狗< / strong>真的< em>真的< / em>脂肪!”中匹配“狗真的很胖”.并添加“< span class =”highlight“>匹配什么< / span>”周围?

我并不是故意这个,但通常能够搜索忽略HTML的文本,将其保留在最终结果中,只是在上面添加跨度吗?

编辑:
考虑到HTML标签重叠问题,是否可以匹配一个短语,只需在每个匹配的单词周围添加跨度?这里的问题是,当不在搜索环境中时,我不希望“狗”这个词匹配,在这种情况下,“狗真的很胖”.

解决方法

更新:

这是一个工作小提琴,做你想要的.但是,您需要更新htmlTagRegEx以处理任何HTML标记的匹配,因为这只是执行简单匹配而不会处理所有情况.

http://jsfiddle.net/briguy37/JyL4J/

此外,下面是代码.基本上,它逐个取出html元素,然后在文本中进行替换,在匹配的选择周围添加高亮区域,然后逐个推回html元素.这很难看,但这是我能想到的最简单的方法……

function highlightInElement(elementId,text){
    var elementHtml = document.getElementById(elementId).innerHTML;
    var tags = [];
    var tagLocations= [];
    var htmlTagRegEx = /<{1}\/{0,1}\w+>{1}/;

    //Strip the tags from the elementHtml and keep track of them
    var htmlTag;
    while(htmlTag = elementHtml.match(htmlTagRegEx)){
        tagLocations[tagLocations.length] = elementHtml.search(htmlTagRegEx);
        tags[tags.length] = htmlTag;
        elementHtml = elementHtml.replace(htmlTag,'');
    }

    //Search for the text in the stripped html
    var textLocation = elementHtml.search(text);
    if(textLocation){
        //Add the highlight
        var highlightHTMLStart = '<span class="highlight">';
        var highlightHTMLEnd = '</span>';
        elementHtml = elementHtml.replace(text,highlightHTMLStart + text + highlightHTMLEnd);

        //plug back in the HTML tags
        var textEndLocation = textLocation + text.length;
        for(i=tagLocations.length-1; i>=0; i--){
            var location = tagLocations[i];
            if(location > textEndLocation){
                location += highlightHTMLStart.length + highlightHTMLEnd.length;
            } else if(location > textLocation){
                location += highlightHTMLStart.length;
            }
            elementHtml = elementHtml.substring(0,location) + tags[i] + elementHtml.substring(location);
        }
    }

    //Update the innerHTML of the element
    document.getElementById(elementId).innerHTML = elementHtml;
}

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...