JavaScript RegExp匹配文本忽略HTML

snz8szmq  于 2023-05-08  发布在  Java
关注(0)|答案(7)|浏览(145)

有没有可能在“The <strong>dog</strong> is really <em>really</em> fat!”中匹配“这只狗真的真的很胖”,并在其周围添加“<span class="highlight">WHAT WAS MATCHED</span>”?
我并不是说这一点特别,但通常能够搜索文本忽略HTML,保持它在最终结果,只是添加跨度以上围绕这一切?

编辑:

考虑到HTML标签重叠的问题,是否可以匹配一个短语,并在每个匹配的单词周围添加跨度?这里的问题是,我不希望单词“dog”不在搜索的上下文中时匹配,在这种情况下,“the dog is really really fat”。

kpbpu008

kpbpu0081#

更新:

这是一把能按你的要求工作的小提琴。但是,您需要更新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;
}
g52tjvyc

g52tjvyc2#

Naah...只需使用好的旧RegExp ;)

var htmlString = "The <strong>dog</strong> is really <em>really</em> fat!";
var regexp = /<\/?\w+((\s+\w+(\s*=\s*(?:\".*?"|'.*?'|[^'\">\s]+))?)+\s*|\s*)\/?>/gi;
var result = '<span class="highlight">' + htmlString.replace(regexp, '') + '</span>';
j8ag8udp

j8ag8udp3#

使用jQuery的一个简单方法是。

originalHtml = $("#div").html();

    newHtml = originalHtml.replace(new RegExp(keyword + "(?![^<>]*>)", "g"), function(e){
                      return "<span class='highlight'>" + e + "</span>";
                   });

$("#div").html(newHtml);

这对我来说很好。

rkue9o1l

rkue9o1l4#

this.keywords.forEach(keyword => {
  el.innerHTML = el.innerHTML.replace(
    RegExp(keyword + '(?![^<>]*>)', 'ig'),
    matched => `<span class=highlight>${matched}</span>`
  )
})
ddarikpa

ddarikpa5#

下面是一个正则表达式的例子来排除html标签和javascript中的匹配:
在replace()脚本中使用此正则表达式。

/(a)(?!([^<])*?>)(?!<script[^>]*?>)(?![^<]*?<\/script>|$)/gi
qij5mzcb

qij5mzcb6#

您可以对表达式</?\w*>使用字符串替换,然后您将得到字符串

f5emj3cl

f5emj3cl7#

如果使用jQuery,可以在包含要搜索的文本的元素上使用text属性。给定此标记:

<p id="the-text">
  The <strong>dog</strong> is really <em>really</em> fat!
</p>

这将产生“狗真的很胖!“:

$('#the-text').text();

您可以在该文本上执行正则表达式搜索,而不是尝试在标记中执行搜索。
如果没有jQuery,我不确定有没有一种简单的方法来从所有子元素中提取和连接文本节点。

相关问题