2008-11-18 16 views
7

tengo una cadena de prueba como esta:RegEx juego etiquetas HTML y la extracción de texto

<customtag>hey</customtag> 

Quiero usar una expresión regular para modificar el texto entre las etiquetas "customtag", por lo que podría tener este aspecto:

<customtag>hey, this is changed!</customtag> 

sé que puedo usar un MatchEvaluator para modificar el texto, pero estoy seguro de la sintaxis de expresiones regulares correcta de usar. Cualquier ayuda sería muy apreciada.

+2

la [Mejor respuesta] (http://stackoverflow.com/a/1732454/80274) a esta pregunta hasta la fecha . –

Respuesta

15

Yo no usaría la expresión regular o bien para esto, pero si tiene que esta expresión debe trabajar: <customtag>(.+?)</customtag>

+0

Gracias - esto funcionó perfectamente. Normalmente no usaría RegEx para analizar HTML de esta manera, pero este HTML es de un sistema interno y está formado correctamente. –

+2

Como advertencia a los demás: no funcionaría en la sintaxis formada correctamente | Parte del texto | - el área entre los símbolos de canalización está adaptada, por lo que el segundo se suprimiría dejando XML mal formado. –

+1

Sí y esta es la razón por la que no debería intentar analizar xml con expresiones regulares. Podrías limitar lo que puede pasar entre las etiquetas y solo permitir letras, números y espacios, y funcionaría un poco mejor. Pero luego está restringido a un dominio específico, por lo que algo como esto: ([a-zA-Z0-9]) + Tjofras

7

Me mordía la pierna antes de usar una expresión regular para analizar y alterar HTML.

Utilice XSL o DOM.


Dos comentarios me han pedido que lo aclare. La sustitución de expresiones regulares funciona en el caso específico en la pregunta del OP, pero en general las expresiones regulares no son una buena solución. Las expresiones regulares pueden coincidir con regular languages, es decir, una secuencia de entrada que puede ser aceptada por una máquina de estados finitos. HTML puede contener etiquetas anidadas a cualquier profundidad arbitraria, por lo que no es un lenguaje normal.

¿Qué tiene esto que ver con la pregunta? Usar una expresión regular para la pregunta del OP como está escrito funciona, pero ¿qué pasa si el contenido entre las etiquetas contiene otras etiquetas? ¿Qué pasa si aparece un carácter literal < en el texto? Han pasado 11 meses desde que Jon Tackabury hizo la pregunta, y supongo que en ese momento, la complejidad de su problema puede haber aumentado.

Las expresiones regulares son excelentes herramientas y las utilizo todo el tiempo. Pero usarlos en lugar de un analizador real para la información que necesita uno va a funcionar solo en casos muy simples. Es prácticamente inevitable que estos casos crezcan más allá de lo que las expresiones regulares pueden manejar. Cuando eso sucede, tendrá la tentación de escribir una expresión regular más compleja, pero estos rápidamente se vuelven muy laboriosos para desarrollar y depurar. Prepárese para eliminar la solución de expresión regular cuando se amplíen los requisitos de análisis.

XSL y DOM son dos tecnologías estándar diseñadas para funcionar con marcado XML o XHTML. Ambas tecnologías saben cómo analizar archivos de marcado estructurados, hacer un seguimiento de las etiquetas anidadas y le permiten transformar los atributos o el contenido de las etiquetas.

Éstos son un par de artículos sobre el uso de XSL con C#:

Aquí hay un par de artículos sobre cómo utilizar DOM con C#:

Aquí hay a.Biblioteca de red que ayuda a las operaciones de DOM y XSL en HTML:

+0

Bueno, yo los utilizo de vez en cuando, en ambientes controlados, con la máquina de código generado que se sabe que es consistente, para un trabajo rápido ... – PhiLho

+4

Entonces ¿por qué no nos muestran cómo hacerlo con XSL o DOM en C#? Es fácil hacer declaraciones radicales. Veamos el código real. Los regexes no son adecuados para analizar HTML general, pero son perfectamente adecuados para hacer cosas específicas con un código HTML específico. –

+0

Admito que me hizo reír, pero vamos a tener una explicación, o un enlace a una buena explicación de por qué prefiere masticar la pierna. Supongo que es realmente obvio por qué para algunos programadores, pero tal vez no para el principiante. –

1

Si no habrá ninguna otra etiqueta entre las dos etiquetas, esta expresión regular es un poco más segura y más eficiente:

<customtag>[^<>]*</customtag> 
0
//This is to replace all HTML Text 

var re = new RegExp("<[^>]*>", "g"); 

var x2 = Content.replace(re,""); 

//This is to replace all &nbsp; 

var x3 = x2.replace(/\u00a0/g,''); 
Cuestiones relacionadas