Cómo search a través de cada parte de HTML

Estoy tratando de ignorar cualquier enlace en una parte de HTML, y get cualquier cosa que no tenga un enlace para hacer mi function.

Lo que tengo hasta ahora es:

$(document).ready(function() { // search through paragraphs $("p").each(function() { // if there is not a link if (!$(this).find('a').hasClass('external-link')) { // do my function } }) }) 

Mi problema es que si hay un enlace en una línea, pero también algo que quiero capturar en la misma línea, no funciona, ya que ignora toda la línea.

Aquí hay un enlace a un JSFiddle en funcionamiento, que con suerte te permitirá ver lo que bash hacer.

Gracias de antemano


Editar:

Pude haber formulado la pregunta de forma ligeramente confusa.

Un ejemplo de lo que estoy tratando de lograr es:

 <p>Link to ignore: <a href="http://www.bbc.co.uk" class="external-link" rel="nofollow">news</a> Link to create: news </p> 

Mi código searchía a través de las tags <p> de "noticias" y luego crearía un enlace al website. Sin embargo, no quiero crear un enlace sobre un enlace existente. Mi código actual ignoraría todo dentro de las tags <p> , porque ya hay un enlace.

Esta es una forma de ignorar los anclajes para que no cree nuevos anclajes dentro de los anclajes existentes.
Esto se dirige solo a los textNodes

 $(document).ready(function () { $("p").contents().each(function(_, node) { if ( node.nodeType && node.nodeType === 3 ) { var regex = /(news)/g; var value = node.nodeValue.replace(regex, '<a href="https://www.bbc.co.uk/$1">$$&</a>'); if (value.match(regex)) { var wrap = document.createElement('span'); wrap.innerHTML = value node.parentNode.insertBefore(wrap, node); node.parentNode.removeChild(node); } } }); }); 

VIOLÍN

Para mantener el dollarign, debe hacer $$ ya que el dollarign tiene un significado especial en una expresión regular.

Tomé un enfoque diferente y extendí el prototipo de function de jQuery –

 $.fn.extend({ replace: function (options) { var defaults = { search: '' }; options = $.extend(defaults, options); return this.each(function () { var string = $(this).html(); //var regex = /(search)/g; var regex = /(^|\s)news/; //var regex = new RegExp("(^|\s)" + options.search); console.log(regex); var replace_text = string.replace(regex, '<a href = "https://www.bbc.co.uk/$1">$&</a>'); $(this).html(replace_text); }); } }); $('p').replace({search: 'news'}); 

EJEMPLO

 $('p').replace(); 

Cambiar la expresión regular ligeramente para dar count de un espacio (en lugar de un par mayor que el paréntesis) al comienzo de 'noticias' permite una sola llamada orderada a la function extendida. También se actualizó para hacer que la function sea más útil, permitiendo al usuario pasar arguments a la function. Todavía no es perfecto, un trabajo en progreso.

Podrías hacer esto mirando los nińos de cada p y agarrando los que no tienen una class de external-link :

 var otherText = []; $("p").each(function(){ console.log(this.childNodes); var kids = this.childNodes; for(var i = 0; i < kids.length; i++) { if(!($(kids[i]).hasClass("external-link"))) { otherText.push(kids[i]); //or do what you want with the node here } } }); console.log("other Text", otherText); 

jsFiddle