¿Cómo escribir una expresión regular para el análisis html?
-
16-09-2019 - |
Pregunta
Estoy intentando escribir una expresión regular para mi analizador html.
Quiero hacer coincidir una etiqueta html con un atributo dado (por ejemplo. <div>
con class="tab news selected"
) que contiene uno o más <a href>
etiquetas.La expresión regular debe coincidir con toda la etiqueta (desde <div>
a </div>
).Parece que siempre recibo errores de "memoria agotada": mi programa probablemente toma todas las etiquetas que puede encontrar como coincidentes.
Estoy usando bibliotecas boost de expresiones regulares.
Solución
También puede encontrar estas preguntas útiles:
¿puede dar algunos ejemplos de por qué es difícil de analizar XML y HTML con una expresión regular?
¿Puede dar un ejemplo de análisis de HTML con su analizador favorito?
Otros consejos
Como otros han dicho, no utilice expresiones regulares, si es posible. Si el código es en realidad XHTML (es decir, que también es un formato XML) IA puede recomendar tanto las Xerces y expatriado analizadores XML, que hará un trabajo mucho betterv para usted que las expresiones regulares.
Tal vez las expresiones regulares no son la mejor solución, pero ya estoy usando como cinco bibliotecas diferentes y impulso hace bien cuando se trata de localizar etiquetas <a href>
y palabras clave.
Estoy usando estas expresiones regulares:
/<a[^\n]*/searched attribute/[^\n]*>[^\n]*</a>/
para localizar etiquetas <a href>
y:
/<a[^\n]*href[[^\n]*>/searched keyword/</a>/
para la localización de enlaces
(Por cierto que puede hacerse mejor - soy muy malo en expresiones regulares;?))
Lo que necesito ahora es la localización de las etiquetas que contienen <a href>
de expresiones regulares y creo que va a hacer bien - tal vez voy a tener que escribir mi propia función de análisis como dijo Piotr.
Haz lo que hace flex:haga coincidir <div> con una coincidencia que no distinga entre mayúsculas y minúsculas y coloque su analizador en un estado "div coincidente", siga procesando la entrada hasta </div> y restablezca el estado.
Esto requiere dos expresiones regulares y una variable de estado.
Los caracteres válidos de las etiquetas SGML son [A-Za-z_:]
Entonces:/<[A-Za-z_:]+>/ coincide con una etiqueta.