Una expresión regular para eliminar una etiqueta HTML dada (x) de una cadena

Digamos que tengo una cadena que contiene un desorden de texto y (x) tags HTML. Quiero eliminar todas las instancias de una etiqueta determinada (y los atributos de esa etiqueta), dejando todas las demás tags y texto. ¿Cuál es la mejor Regex para hacer esto?

Editado para agregar: Oh, aprecio que usar Regex para este problema en particular no sea la mejor solución. Sin embargo, en aras de la discusión ¿podemos suponer que esa decisión técnica particular se tomó unos pocos niveles sobre mi grado de pago? 😉

Intentar analizar HTML con expresiones regulares suele ser una idea extremadamente mala. Use un analizador en su lugar, debe haber uno disponible para su idioma elegido.

Es posible que puedas salirte con algo como esto:

]*?> 

Pero depende exactamente de lo que estás haciendo. Por ejemplo, eso no eliminará el contenido de la etiqueta, y puede dejar su HTML en un estado no válido, dependiendo de qué etiqueta está tratando de eliminar. También se maneja mal con HTML no válido (y hay mucho de eso).

Use un analizador en su lugar 🙂

Creo que hay una seria intolerancia anti-regex aquí. Hay muchas ocasiones en que es posible que desee quitar una etiqueta particular de un marcado cuando no tiene sentido utilizar un analizador completo.

Por supuesto, hay momentos en que un analizador puede ser la mejor opción, pero si está buscando una expresión regular, entonces:

 ]*?>[\s\S]*?<\/script> 

Eso eliminaría las tags de script y sus contenidos. Asegúrese de utilizar coincidencias que no distingan entre mayúsculas y minúsculas.

Si no desea eliminar el contenido de la etiqueta, puede usar:

 <\/?script[^>]*?> 

Un ejemplo de uso en javascript sería:

 function stripScripts(markup) { return markup.replace(/]*?>[\s\S]*?<\/script>/gi, ''); } var safeText = stripScripts(textarea.value); 

Creo que podría ser Raymond Chen (blogs.msdn.com/oldnewthing) que estoy parafraseando (¡mal!) Aquí … Pero, ¿quieres una expresión regular? “Ahora tienes dos problemas” …: =)

Si la cadena está bien formada (X) HTML, ¿podría cargarla en un analizador (HTML / XML) y usarla para eliminar los nodos de la variedad ofensiva? Si no está bien formado, entonces se vuelve un poco más complicado, pero sospecho que un RegEx no es la mejor manera de hacerlo …

Solo hay DEMASIADAS formas en que puede aparecer una sola etiqueta, sin mencionar codificaciones, variantes, etc.
Recomiendo encarecidamente que reconsidere este enfoque … realmente no debería tener que manejar HTML directamente, de todos modos.

Fuera de mi cabeza, diría que esto te ayudará a comenzar en la dirección correcta.

 s/]*>([^<]*)]*>/\1 

Básicamente, encuentre la etiqueta de inicio, cualquier texto entre las tags, y luego la etiqueta de finalización. Reemplaza todo con lo que haya entre las tags.

Respuesta corregida:

 ]*?> 

Porque la respuesta de Dans eliminaría
, pero solo quieres

Aquí hay una expresión regular que escribí para este propósito, funciona en algunas situaciones más:

  

Si bien el uso de expresiones regulares para analizar HTML generalmente está mal visto o menospreciado, es casi seguro que no desee escribir su propio analizador.

Sin embargo, podría utilizar algunas funciones integradas o de biblioteca para lograr lo que necesita.

  • JavaScript tiene getElementsByTagName y getElementById , por no mencionar jQuery .
  • PHP tiene la extensión DOM .
  • Python tiene la impresionante sopa hermosa
  • …y muchos más.