Encuentre una cadena de texto en un elemento y envuelva algunas tags de trazo a su alrededor

Quiero encontrar una cadena de texto en un elemento y rodearlo con algunas tags de tramo. P.ej:

Desde

We have cows on our farm

hasta

We have cows on our farm

He intentado:

 $("h2:contains('cow')").each(function() { $(this).text().wrap(""); }); 

Pero eso solo envuelve la etiqueta que contiene h2.

 $("h2:contains('cow')").html(function(_, html) { return html.replace(/(cow)/g, '$1'); }); 

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

Otro enfoque, dividido por palabra clave y únete al html actualizado.

 $("h2:contains('cow')").html(function(_, html) { return html.split('cow').join("cow"); }); 

Nota: No he probado esto, pero estoy suponiendo que esto funcionaría peor que hacer un reemplazo, pero figura que incluiría de todos modos con fines informativos

Aquí hay una variación de la respuesta de @ undefined, que recorre una gran variedad de elementos:

 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, '' + value + ''); }); }); 
 $("h2:contains('cow')").each(function() { var newText = $(this).html().replace("cow", ""); $(this).html(newText); }); 

En mi caso, tengo una etiqueta dentro del div de destino y algo de texto que necesito para envolver ese texto en un enlace.

Así lo hice después de “¿Qué has intentado”.

 var oldText = $(this).text(), newText = $(this).html().replace( oldText, "" + oldText + "" ); $(this).html(newText);