我想在元素中找到一串文本,并在其周围包裹一些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
标记。
答案 0 :(得分:71)
$("h2:contains('cow')").html(function(_, html) {
return html.replace(/(cow)/g, '<span class="smallcaps">$1</span>');
});
答案 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);