2009-07-21 9 views
5

quiero reemplazar una cadena en la página HTML usando JavaScript, pero ignorarlo, si se encuentra en una etiqueta HTML, por ejemplo:Regex cadena de reemplazo, pero no html dentro de la etiqueta

<a href="google.com">visit google search engine</a> 
you can search on google tatatata... 

quiero reemplazar google por <b>google</b>, pero no aquí:

<a href="google.com">visit google search engine</a> 
you can search on <b>google</b> tatatata... 

probé con éste:

regex = new RegExp(">([^<]*)?(google)([^>]*)?<", 'i'); 
el.innerHTML = el.innerHTML.replace(regex,'>$1<b>$2</b>$3<'); 

pero el problema: Tengo <b>google</b> dentro de la etiqueta <a>:

<a href="google.com">visit <b>google</b> search engine</a> 
you can search on <b>google</b> tatatata... 

¿Cómo se puede solucionar esto?

Respuesta

6

Sería mejor usar un analizador html para esto, en lugar de regex. No estoy seguro de que se pueda hacer de manera 100% confiable.

1

realmente no se puede hacer eso, el "google" es siempre de alguna etiqueta, ya sea reemplazar todos o ninguno

5

Usted puede o no ser capaz de ver con una expresión regular. Depende de qué tan preciso pueda definir las condiciones. Decir que desea reemplazar la cadena, excepto si está en una etiqueta HTML, no es lo suficientemente estrecha, ya que todo en la página se encuentra presumiblemente dentro de alguna etiqueta HTML (BODY, si no hay nada más).

Probablemente sería mejor recorrer el árbol DOM para esto en lugar de tratar de usar una expresión regular en el HTML.

+1

Estoy de acuerdo. Encuentra todos los nodos de texto en el DOM que contienen la cadena. Mantenga una lista negra de etiquetas en las que ** no desea ** reemplazar la cadena. Compruebe si el nodo de texto se encuentra dentro de una de estas etiquetas. Si no, haga su reemplazo, de lo contrario déjelo como está. – tvanfosson

1

Analizar HTML con una expresión regular no va a ser fácil para nada que no sean casos triviales, ya que HTML no es normal.

Para obtener más información, vea this Stackoverflow question (y sus respuestas).

0

Bueno, como todo es parte de una etiqueta, su pedido no tiene sentido. Si es solo la etiqueta <a />, puede que solo busque esa parte. Principalmente por asegurarse de que no tiene una etiqueta de </a> colas antes de una nueva <a>

1

Creo que todo lo que se está perdiendo la cuestión aquí ...

Cuando dice dentro de la etiqueta, que significa dentro de la abertura etiqueta, como en el < a href = "google.com" > etiqueta ... Esto es algo bastante diferente de texto, por ejemplo, dentro de un <p> </p > par de etiquetas o <cuerpo> </> cuerpo. Si bien todavía no tengo la respuesta, estoy luchando con este mismo problema y sé que tiene que ser solucionable usando Regex. Una vez que lo encuentre, volveré y publicaré.

1

Solución

Si no puede utilizar un analizador de HTML o está muy seguro acerca de su estructura HTML intente esto:

  1. hacer el "malo" cambiar
  2. repetición reemplazar (< [^>] *) (< [^>] +>) a $ 1 varias veces (tanto como lo necesite)

Es un solución simple, pero funciona para mí.

Contras? Bueno ... Hay que hacer lo reemplace dos veces para el caso ... ...>, ya que elimina sólo la etiqueta primero no deseado de cada etiqueta en la página

[editar:] SOLUCIÓN

Por qué no usar jQuery, poner el código hTML en la página y hacer algo como esto:

$(containerOrSth).find('a').each(function(){ 
if($(this).children().length==0){ 
$(this).text($(this).text().replace('google','evil')); 
}else{ 
//here You have to care about children tags, but You have to know where to expect them - before or after text. comment for more help 
} 
}); 
+0

Otra desventaja es que no es un analizador sintáctico. – BalusC

+1

Oye, dije "si no puedes usar un analizador sintáctico", así que sí, no es – naugtur

0

Usted puede hacer que el uso de expresiones regulares, pero bloquee el filtrado como el estilo, escritura y CDATA necesitará más trabajo, y no se ha implementado en la siguiente solución.

La mayoría de las respuestas indican que 'sus datos siempre están en algunas etiquetas', pero les falta el punto, los datos están siempre 'entre' algunas etiquetas, y desea filtrar dónde está 'en' una etiqueta.

Tenga en cuenta que los caracteres de las etiquetas en las secuencias de comandos en línea probablemente rompan esto, por lo que si existen, se deben procesar por separado con este método. Eche un vistazo a aquí:
complex html string.replace function

Cuestiones relacionadas