Подтвердить что ты не робот

Найти строку текста в элементе и обернуть вокруг него теги span

Я хочу найти строку текста в элементе и обернуть вокруг него несколько тегов span. Например

От:

<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.

4b9b3361

Ответ 1

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

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

Ответ 2

Другой подход, разбитый по ключевому слову и соединение с обновленным html.

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

Примечание. Я не тестировал это, но я предполагаю, что это будет хуже, чем замена, но цифра, которую я буду включать в любом случае в информационных целях

Ответ 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>');
    });
});

Ответ 4

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

Ответ 5

В моем случае у меня есть тег внутри целевого 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);