在元素中查找文本字符串并在其周围包裹一些span标记

时间:2013-04-18 18:27:27

标签: jquery string text

我想在元素中找到一串文本,并在其周围包裹一些span标签。 E.g。

自:

<h2>We have cows on our farm</h2>

要:

<h2>We have <span class='smallcaps'>cows</span> on our farm</h2>

我试过了:

$("h2:contains('cow')").each(function() {
 $(this).text().wrap("<span class='smallcaps'></span>");
});

但这只包含整个包含h2标记。

6 个答案:

答案 0 :(得分:71)

$("h2:contains('cow')").html(function(_, html) {
   return html.replace(/(cow)/g, '<span class="smallcaps">$1</span>');
});

http://jsfiddle.net/w5ze6/1/

答案 1 :(得分:12)

另一种方法,按关键字拆分并加入更新后的html。

$("h2:contains('cow')").html(function(_, html) {
   return html.split('cow').join("<span class='smallcaps'>cow</span>");
});

注意:我还没有对此进行过测试,但我认为这会比替换更糟糕,但是我会将其包含在信息用途中

答案 2 :(得分:3)

这是@undefined答案的变体,它遍历一系列项:

var barnyardArray = [
    'cow',
    'horse',
    'chicken',
    'hog',
    'goat',
    'goose',
    'duck',
    'llama'
];

$.each(barnyardArray, function (index, value) {
    $("p:contains(" + value + ")").html(function (_, html) {
        var regex = new RegExp(value, 'g');
        return html.replace(regex, '<span class="smallcaps">' + value + '</span>');
    });
});

答案 3 :(得分:1)

您通常希望以不区分大小写的方式匹配一些任意文本。有时,搜索查询包含的字符是特殊的正则表达式元字符,在编译模式之前必须对其进行转义。

使用类似的解决方案

var words = ["cows", "c++", "$var$"];
$("h2").html(function(_, html) {
   return html.replace(new RegExp(words.map(function(x) { 
       return x.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')
     }).join('|'), "gi"), '<span class="smallcaps">$&</span>')
});
span { color: red}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<h2>We have cows on our farm</h2>
<h2>C++ Apps $var$</h2>

请注意,这里的正则表达式看起来像/cows|c\+\+|\$var\$/gi,其中+$special regex metacharacters被转义,并且替代项与{{1 }} alternation operator

此外,请注意,由于默认组是保存整个匹配项的组0,因此不需要任何外部括号,并且JavaScript正则表达式中对组0的后向引用是|。因此,搜索字词的替换总是以与在文本中找到的字母完全相同的方式进行。

请注意,如果只需要匹配整个单词,则需要使用特殊边界,$&(如果搜索词始终由字母,数字或{{1}组成) })或\b / _(如果可以包含特殊字符):

(\W|^)
(?!\w)
var words = ["cows", "c++", "$var$"];
$("h2").html(function(_, html) {
   return html.replace(new RegExp("(\\W|^)(" + words.map(function(x) { 
       return x.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')
     }).join('|') + ")(?!\\w)", "gi"), '$1<span class="smallcaps">$2</span>')
});

答案 4 :(得分:0)

$("h2:contains('cow')").each(function() {
    var newText = $(this).html().replace("cow", "<span class='smallcaps'></span>");
    $(this).html(newText);
});

答案 5 :(得分:0)

在我的情况下,我在目标div中有一些标记和一些文本我需要将该文本包装成链接。

这是我怎么做的“你有什么尝试”。

var oldText = $(this).text(),
newText = $(this).html().replace(
    oldText, 
    "<a class='k-link' href='#' class='smallcaps'>" + 
        oldText + 
    "<span class='k-icon k-i-arrow-n'></span></a>"
);
$(this).html(newText);