2009-06-06 64 views
9

Tengo una cadena en JavaScript e incluye una etiqueta a con href. Quiero eliminar todos los enlaces y del texto. Sé cómo eliminar el enlace y dejar el texto interno, pero quiero eliminar el enlace por completo.Regex en Javascript para eliminar enlaces

Por ejemplo:

var s = "check this out <a href='http://www.google.com'>Click me</a>. cool, huh?"; 

me gustaría usar una expresión regular por lo que me queda:

s = "check this out. cool, huh?"; 
+0

La otra pregunta es específica para el DOM (por ejemplo, navegador, jsdom), mientras que esta pregunta es JavaScript general. – mikemaccana

+0

@mikemaccana +1. Esta pregunta es acerca de la manipulación de cadenas en lugar de la manipulación DOM. Votando para desmarcar duplicado. –

+0

Para ser precisos, ¿no te quedaría con "mira esto, genial, ¿eh?" Si estás quitando el 'a's? – Jeroen

Respuesta

13

esto tira a todo lo que entre <a y /a>:

mystr = "check this out <a href='http://www.google.com'>Click me</a>. cool, huh?"; 
alert(mystr.replace(/<a\b[^>]*>(.*?)<\/a>/i,"")); 

En realidad no es infalible, pero tal vez que va a hacer el truco para su propósito ...

+2

mi sugerencia:/] *)?>. *?<\/a>/ig – Christoph

3

expresiones regulares son fundamentalmente malo en análisis de HTML (ver Can you provide some examples of why it is hard to parse XML and HTML with a regex? por qué). Lo que necesitas es un analizador HTML. Ver Can you provide an example of parsing HTML with your favorite parser? para ejemplos usando una variedad de analizadores.

+0

Duplicado http://www.google.com/search?q=site:stackoverflow.com+%22Regexes+are+fundamentally+bad+at+parsing+HTML%22;) – Gumbo

+0

Esto comienza a sonar como un cliché. A veces no es necesario realmente analizar el HTML en una estructura de datos de algún tipo, solo tiene que manipular de alguna manera esa cadena. Hay casos en los que RegExp tiene sentido. Herramienta correcta para el trabajo correcto. Y, por cierto, John Resig ha escrito un analizador HTML en JavaScript y utilizó algunos RegExp allí. http://ejohn.org/blog/pure-javascript-html-parser/ –

+0

@Ionut G. Stan Siempre necesita analizar HTML en una estructura de datos porque esa es la única manera de trabajar de manera confiable con él. Los Regex son parte del análisis sintáctico, pero estas preguntas siempre quieren usar una expresión regular para encontrar o reemplazar algo. Eso es imposible con expresiones regulares tradicionales (como se muestra en el enlace de la respuesta) y muy difícil de corregir con aquellas en las que es posible (por ejemplo, la implementación de Perl que agrega recursividad). Hay muchas bibliotecas disponibles que ya realizan la tarea de trabajar con HTML por usted. Debes usarlos, no una expresión regular que está garantizada para fallar. –

0

Si sólo desea eliminar <a> elementos, lo siguiente debería funcionar bien:

s.replace(/<a [^>]+>[^<]*<\/a>/, ''); 

Esto debería funcionar por el ejemplo que dio, pero no va a funcionar para etiquetas anidadas, por ejemplo, que wouldn' t trabajo con este código HTML:

<a href="http://www.google.com"><em>Google</em></a> 
9

Solo para aclarar, para quitar las etiquetas de enlace y dejar intacto todo entre ellas, se trata de un proceso de dos pasos: eliminar la etiqueta de apertura y luego quitar la etiqueta de cierre.

txt.replace(/<a\b[^>]*>/i,"").replace(/<\/a>/i, ""); 

muestra de trabajo:

<script> 
function stripLink(txt) { 
    return txt.replace(/<a\b[^>]*>/i,"").replace(/<\/a>/i, ""); 
} 
</script> 

<p id="strip"> 
<a href="#"> 
    <em>Here's the text!</em> 
</a> 
</p> 

<p> 
<input value="Strip" type="button" onclick="alert(stripLink(document.getElementById('strip').innerHTML))"> 
</p> 
+0

@Amit tienes razón, cometí un error. Lo siento. – mikemaccana