2008-09-22 48 views
6

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

Editado para agregar: Oh, aprecio que usar un 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? ;)

Respuesta

17

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

Usted puede ser capaz de salirse con algo como esto:

</?tag[^>]*?> 

pero depende de exactamente lo que está 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).

Utilizar un analizador lugar :)

+0

Dangit, no ejecute la diversión para todas las personas que crean expresiones regulares con su respuesta obviamente correcta! – Will

+0

Necesita hacer que * no sea codicioso (*?) O perderá todo, desde la primera etiqueta coincidente hasta el último símbolo de mayor que en la cadena. – Prestaul

0

yo creo que puede ser Raymond Chen (blogs.msdn.com/oldnewthing) que estoy parafraseando (mal!) ... Pero aquí, que desea una expresión regular ? "Ahora tiene dos problemas" ...: =)

Si la cadena está bien formada (X) HTML, ¿podría cargarla en un analizador (HTML/XML) y usar esto 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 ...

+0

Raymond Chen usó esa declaración, pero citaba a Jaime Zawinski. –

0

Hay TOO muchas formas en que una etiqueta puede aparecer , sin mencionar codificaciones, variantes, etc.
Sugiero que reconsidere este enfoque ... realmente no debería tener que manejar HTML directamente, de todos modos.

0

Por la parte superior de mi cabeza, yo diría que esto lo ayudará a comenzar en la dirección correcta.

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

Básicamente, encuentre la etiqueta de inicio, cualquier texto entre las etiquetas, y luego la etiqueta de cierre. Reemplaza todo con lo que haya entre las etiquetas.

15

Creo que hay una grave intolerancia contra la regex que está sucediendo 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 programa de análisis podría ser la mejor opción, pero si usted está buscando una expresión regular a continuación:

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

que eliminaría etiquetas 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 a continuación, puede utilizar:

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

Un ejemplo del uso de JavaScript sería:

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

var safeText = stripScripts(textarea.value); 
+1

Oye, no pasa nada malo con las expresiones regulares, es solo que no se puede escribir un analizador HTML en uno (de hecho, creo que se puede en Perl (perl tiene algunas cosas de regex extra), ¡pero no se puede mantener!). – Dan

+0

Estoy de acuerdo con usted. En algún momento, desea actuar solo en una página determinada, con estructura bien conocida, o HTML generado por una herramienta, con resultados bien definidos. Cuando el código es predecible, usar una expresión regular podría tener sentido. ¡Utilizarlos para analizar cualquier HTML escrito por humanos es más arriesgado! ;-) – PhiLho

0

respuesta Corregido:

</?TAG\b[^>]*?> 

Porque la respuesta de Dans eliminaría <br />, pero solo quiere <b>

0

Aquí es una expresión regular que escribí para este fin, que funciona en unos pocos más situaciones:

</?(?(?=b|img|a|script)notag|[a-zA-Z0-9]+)(?:\s[a-zA-Z0-9\-]+=?(?:(["",']?).*?\1?)?)*\s*/?> 
0

Durante el uso de expresiones regulares para analizar HTML es generalmente mal visto o despreciados, es casi seguro que no quiere para escribir tu propio analizador.

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

  • Javascript getElementsByTagName y getElementById, por no hablar de jQuery.
  • PHP tiene la extensión DOM.
  • Python tiene el impresionante Beautiful Soup
  • ... y muchos más.
Cuestiones relacionadas