Detectar etiquetas HTML usando expresiones regulares en C#

A veces es necesario acceder de manera automatizada a sitios web, analizando el contenido de los mismos buscando datos o patrones. Una de las maneras más útiles y flexibles de desarrollar estas tareas es mediante el uso de expresiones regulares.

Una expresión regular es un texto formado por símbolos específicos, que componen un patrón. Este patrón se emplea para localizar elementos en un texto que cumplan los criterios establecidos.

<h1>(.*)</h1>

Esta expresión coincidirá para cualquier título que contenga la página. El significado es sencillo: El punto significa cualquier caracter, incluídos los saltos de línea, y el asterisco significa ninguno o cualquier número de ellos. Los paréntesis significan que es un grupo, es decir, que queremos capturar ese contenido (no solo comprobar que está en el texto).

Esto, en el contexto de C# se define de la siguiente manera:

string pattern = "<h1>(.*)<\\/h1>";
string text = @"<html>
                    <head>
                    </head>
                    <body>
                    <h1 class=""title"">Hola mundo</h1>
                    <h1>Noticia de ultima hora</h1>
                    </body>
                    </html>";

MatchCollection matches = Regex.Matches(text, pattern);
foreach (Match item in matches)
{
    Console.WriteLine(item.Groups[1].Value);
}

En este código se pueden ver varios elementos, la variable pattern contiene el patrón a encontrar (con las barras verticales correctamente escapadas), la variable text el texto en el que se quiere buscar, y luego el código que realiza la búsqueda.

Como lo que se quiere es encontrar todas las apariciones y no solo una, se usa Regex.Matches en vez de Regex.Match, y luego se itera entre cada uno de los elementos encontrados. El grupo 0 siempre está vacío, por eso se usa el índice 1 para obtener el valor correcto.

En este caso la salida será algo así:

Hola mundo
Noticia de ultima hora

No siempre este tipo de etiquetas aparecen solas, sino que suelen venir acompañadas por elementos como id, class, style, u otros, que luego emplea CSS para dar estilo. Esto haría imposible que se detectara con el código actual, aunque con una leve modificación del parámetro, es posible también detectar este tipo de etiquetas:

<h1.*>(.*)</h1>

Esta expresión encontrará ambas entradas en el siguiente texto:

            string text = @"<html>
                    <head>
                    </head>
                    <body>
                    <h1 id=""ultima"" class=""title"">Hola mundo</h1>
                    <h1>Noticia de ultima hora</h1>
                    </body>
                    </html>";

Más información

Las expresiones regulares van mucho más allá de este artículo, se puede encontrar más información en los siguientes sitios (en inglés):

3 pensamientos en “Detectar etiquetas HTML usando expresiones regulares en C#

  1. monchomartinez

    Como puedo hacer para que con este patrón: “{(.*)}” y este texto: “rellena {el hueco} con tu nombre y {este otro} con tu apellido” me devuelva dos valores? me devuelve solo uno ya que no se para en el primer corchete: ‘el hueco} con tu nombre y {este otro’.

    Como hago si quiero que me devuelva también los corchetes?

    Gracias ;)

    Responder
  2. Miguel Camacho

    Hola depronto tienes el codigo completo, ando buscando algo parecido pero estoy bastante perdidor, gracias

    Responder

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s