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).
html tag y regexp no es realmente una buena idea –
Gosh, ¿realmente crees? – bobince