2010-07-02 13 views
5

Tengo una cadena como fuente HTML y quiero comprobar si la fuente HTML que es cadena contiene una etiqueta que no está abierta.Comprobación de una cadena HTML para etiquetas sin abrir

Por ejemplo, la cadena a continuación contiene </u> después de WAVEFORM que no tiene apertura <u>.

WAVEFORM</u> YES, <u>NEGATIVE AUSCULTATION OF EPIGASTRUM</u> YES, 

sólo quiero comprobar si este tipo de etiqueta cerrada y luego tengo que añadir la etiqueta abierta al inicio de la cadena?

Respuesta

6

Para este caso específico puede usar HTML Agility Pack para afirmar si el HTML está bien formado o si no tiene etiquetas abiertas.

var htmlDoc = new HtmlDocument(); 

htmlDoc.LoadHtml(
    "WAVEFORM</u> YES, <u>NEGATIVE AUSCULTATION OF EPIGASTRUM</u> YES,"); 

foreach (var error in htmlDoc.ParseErrors) 
{ 
    // Prints: TagNotOpened 
    Console.WriteLine(error.Code); 
    // Prints: Start tag <u> was not found 
    Console.WriteLine(error.Reason); 
} 
0

No es tan fácil. No se puede usar directamente un analizador HTML porque no es HTML válido, pero no se puede generar fácilmente una expresión regular en todo el conjunto, ya que las expresiones regulares no pueden hacer frente a la anidación u otras complicaciones HTML.

Probablemente lo mejor que podría hacer sería usar una expresión regular para encontrar cada estructura de marcado, por ej. algo así como:

<(\w+)(?:\s+[-\w]+(?:\s*(?:=\s*(?:"[^"]*"|'[^']*'|[^'">\s][^>\s]*)))?)*\s*> 
|</(\w+)\s*> 
|<!--.*?--> 

Comience con una lista vacía-tag-a abierta y una lista vacía-etiquetas para cerrar. Para cada coincidencia en la cadena, observe los grupos 1 y 2 para ver si tiene una etiqueta de inicio o fin. (O un comentario, que puede ignorar)

Si tiene una etiqueta de inicio, necesita saber si necesita un cierre, es decir. si es una de las EMPTY etiquetas de modelo de contenido como <img>. Si un elemento es EMPTY, no necesita cerrarse para que pueda ignorarlo. (Si tiene XHTML, todo es un poco más fácil.)

Si tiene una etiqueta de inicio, agregue el nombre de la etiqueta en el grupo de expresiones regulares a la lista de etiquetas para cerrar. Si tiene una etiqueta de cierre, retire una etiqueta del final de la lista de etiquetas para cerrar (debe ser el mismo nombre de etiqueta que estaba allí, de lo contrario obtendrá un marcado no válido. Si no hay etiquetas en la lista de etiquetas para cerrar, en su lugar, agregue el nombre de la etiqueta a la lista de etiquetas para abrir.

Una vez que haya llegado al final de la cadena de entrada, anteponga cada etiqueta de etiquetas para abrir la secuencia en orden inverso, y añada las etiquetas de cierre para las etiquetas para cerrar hasta el final, de nuevo en orden inverso.

(Sí, estoy analizando HTML con expresiones regulares. Creo que la malicia de esto demuestra Por qué no quieres hacerlo. Si hay algo que puedas hacer para evitar haber recortado tu marcado en el medio de una etiqueta, hazlo).

+0

html tag y regexp no es realmente una buena idea –

+2

Gosh, ¿realmente crees? – bobince

Cuestiones relacionadas