Expresiones regulares para SEO y Google Analytics

Las expresiones regulares (RegEx) pueden parecer muy complicadas a primera vista y que no son más que un puñado de letras y símbolos puestos de manera aleatoria que da la casualidad de que funcionan y hacen algo; pero si las observas un poco y entiendes su significado, te serán muy MUY útiles.

Con esta guía de RegEx para SEO y Google Analytics lo que quiero es conseguir tener un repositorio (para mi también) para poder consultar siempre que tengan una duda, ya que honestamente, si no las usas muy a menudo siempre se te olvida algo ;)

Las expresiones regulares son tremendamente útiles para SEO y Google Analytics para:

  • Crear filtros
  • Crear segmentos
  • Realizar búsqueda
  • Hacer redirecciones 301 masivas
  • Crear “canonicals” de manera masiva
  • Reescribir URLs

¿Qué es una expresión regular?

Una expresión regular es una expresión en formato de texto formado por caracteres ordinarios (letras de la A a la Z, por ejemplo) y caracteres especiales (llamados metacaracteres) que sirven para buscar un patrón en una cadena (string).

Por ejemplo: la RegEx ^Gatos?$ coincide con la búsqueda de Gato y Gatos.

¿Qué son los metacaracteres?

Son caracteres especiales que tienen significados concretos en RegEx, son los que crean la estructura de una expresión regular.

Tipos de metacaracteres

tipos de metacaracteres para expresiones regulares

Otros tipos de metacaracteres (no tan usados)

otros tipos de metacaracteres

A continuación voy a ir uno por uno explicando los diferentes metacaracteres con diferentes ejemplos para que se entienda todo mejor :)

Acento circunflejo ^

El símbolo ^ se utiliza para definir el comienzo de una expresión regular.

^\/Colou?r => Encontrar un patrón que empiece por ‘/Color’ o ‘/Colour’. Por ejemplo:

/Colour/?product=1234/review

/Color-red/?product=1234/review

^\/Nov(iembre)? => Encontrar un patrón que empiece por ‘/Nov’ o ‘/Noviembre’. Por ejemplo:

/Noviembre-ventas/?product=1234/review

/Nov-ventas/?product=1234/review

^\/cursos\.html => Encontrar un patrón que empiece por ‘/cursos.html’. Por ejemplo:

/cursos.html/?product=1234/review

^\/.*\.php => Encontrar un patrón que empiece por cualquier carpeta con extensión .php . Por ejemplo:

/cursos.php/color/?proid=1234/review

/productos.php/?proid=1234/

/b4.php/color/?proid=1234&gclid=1234

^\/precio-producto\.php => Encontrar un patrón que empiece por ‘/precio-producto.php’. Example:

/precio-producto.php?proid=1234&cid=1234

/precio-producto.php?cid=1234&gclid=1234

El acento circunflejo también significa NO cuando se usa después de un bracket [corchete] de apertura.

[^a] => Busca cualquier carácter único que sea diferente a la minúscula ‘a’.

Por ejemplo: la RegEx producto-[^a] coincidirá con:

/tienda/hombre/ventas/producto-b

/tienda/hombre/ventas/producto-c

[^B] => Busca cualquier carácter único que sea diferente a la mayúscula ‘B’.

Por ejemplo: la RegEx producto-[^B] coincidirá con:

/tienda/hombre/ventas/producto-b

/tienda/hombre/ventas/producto-c

[^1] => Busca cualquier carácter único que sea diferente a ‘1’.

Por ejemplo: la RegEx proid=[^1] coincidirá con:

/hombre/ventas/producto-b?proid=5234&gclid=153

pero no coincidirá con:

/hombre/ventas/producto-b?proid=1234&gclid=153dwf3533

[^ab] => Busca cualquier carácter único que sea diferente a las minúsculas ‘a’ y ‘b’.

Por ejemplo: la RegEx lugar=[^ab] coincidirá con:

/tienda/coleccion/prodID=141?lugar=espana

pero no coincidirá con:

/tienda/coleccion/prodID=141?lugar=america

/tienda/coleccion/prodID=141?lugar=barcelona

[^aB] => Busca cualquier carácter único que sea diferente a la minúscula ‘a’ y la mayúscula ‘B‘.
[^1B] => Busca cualquier carácter único que sea diferente al número ‘1’ y la mayúscula ‘B’

[^Dog] => Busca cualquier carácter único que sea diferente a: mayúscula ‘D’, minúscula ‘o’ y la minúscula ‘g’.

Por ejemplo: la RegEx lugar=[^Dog] coincidirá con:

/tienda/coleccion/prodID=141?lugar=cabrales

/tienda/coleccion/prodID=141?lugar=dinamarca

pero no coincidirá con:

/tienda/coleccion/prodID=141?lugar=Denia

/tienda/coleccion/prodID=141?lugar=ojete

/tienda/coleccion/prodID=141?lugar=garrulo

[^123b] => Busca cualquier carácter único que sea diferente a: número ‘1’, número ‘2’, número ‘3’ y la minúscula ‘b’.

[^1-3] => Busca cualquier carácter único que sea diferente a: número ‘1’, número ‘2’ y número ‘3’.

Por ejemplo: la RegEx prodID=[^1-3] coincidirá con:

/tienda/coleccion/prodID=45321&cid=1313

/tienda/coleccion/prodID=5321&cid=13442

pero no coincidirá con:

/tienda/coleccion/prodID=12321&cid=1313

/tienda/coleccion/prodID=2321&cid=1313

/tienda/coleccion/prodID=321&cid=1313

[^0-9] => Busca cualquier carácter único que sea diferente a un número.

Por ejemplo: la RegEx de\/[^0-9] coincidirá con todos las páginas de la carpeta /es/ que no empiecen por un número:

/es/gatos-voladores

/es/perros-subacuaticos

pero no coincidirá con:

/es/12fggtyooo

[^a-z] => Busca cualquier carácter único que sea diferente a una letra minúscula.

Por ejemplo: la RegEx de\/[^a-z] coincidirá con todos las páginas de la carpeta /es/ que no empiecen por una letra minúscula:

/es/2una-chorrada
/es/371978230

pero no coincidirá con:

/es/cerveza

[^A-Z] => Busca cualquier carácter único que sea diferente a una letra mayúscula


Dolar $

El símbolo $ se usa para definir el final de una expresión regular o el final de una línea. Por ejemplo:

Colou?r$ => Busca un patrón que termine por ‘Color’ o ‘Colour’

Nov(iembre)?$ => Busca un patrón que termine por ‘Nov’ o ‘Noviembre’

cursos\.html$ => Busca un patrón que termine por ‘cursos.html’

\.php$ => Busca un patrón que termine por .php

precio-precio\.php$ => Busca un patrón que termine por ‘precio-producto.php’


Corchetes [ ]

Los símbolos [ ] para buscar cualquier carácter que se encuentre dentro de lo que especificamos en los corchetes. Por ejemplo:

[a] =>Busca cualquier carácter que sea la letra minúscula ‘a’.

[ab]
=> Busca cualquier carácter que sea o bien la letra minúscula ‘a’ o la letra minúscula ‘b’.

[aB] => Busca cualquier carácter que sea o bien la letra minúscula ‘a’ o la letra mayúscula ‘B’

[1B] => Busca cualquier carácter que sea o bien el número ‘1’ o la letra mayúscula ‘B’.

[Dog] => Busca cualquier carácter que sea: la letra mayúscula ‘D’, letra minúscula ‘o’ o la letra minúscula ‘g’.

[123b] => Busca cualquier carácter que sea: número ‘1’, número ‘2’, número ‘3’ o la letra minúscula ‘b’.

[1-3] => Busca cualquier carácter que sea el número 1, 2 o 3.

[0-9] => Busca cualquier carácter que sea un número.

[a-d] => Busca cualquier carácter que sea una de las siguientes letras minúsculas: ‘a’, ‘b’, ‘c’ or ‘d’.

[a-z] => Busca cualquier carácter que sea una letra minúscula.

[A-Z] => Busca cualquier carácter que sea una letra mayúscula.

[A-T] => Busca cualquier carácter que sea una letra mayúscula de la ‘A’ a la ‘T’.

[casa.php] => Busca cualquier carácter que sea: letra minúscula ‘c’, letra minúscula ‘a’, letra minúscula ‘s’, letra minúscula ‘a’, un punto ‘.’, letra minúscula ‘p’, letra minúscula ‘h’ or lletra minúscula ‘p’

[a-zA-Z]=> Busca cualquier carácter que sea una letra minúscula o mayúscula.


Parentesis ( )

Los símbolos ( ) se usan para buscar una cadena en concreto.

(a)=> Busca la cadena ‘a’

(ab) => Busca la cadena ‘ab’

(dog) => Busca la cadena ‘perro’

(dog123) => Busca la cadena ‘perro123’

(0-9) => Busca la cadena ‘0-9’

(A-Z) => Busca la cadena ‘A-Z’

(a-z) => Busca la cadena ‘a-z’

(123dog588) => Busca la cadena ‘123perro588’

Nota: Los paréntesis también se usan para crear y almacenar variables en lenguajes de programación (SQL, Python, etc)


Interrogación ?

El símbolo ? se usa para buscar una o ninguna coincidencia del carácter que le precede. For e.g.

[a]? => Busca una o ninguna coincidencia de la letra minúscula ‘a’.

[dog]? => Busca una o ninguna coincidencia de las letras minúsculas ‘d’, ‘o’ o ‘g’.

[^dog]? => Busca una o ninguna coincidencia de caracteres que no son las letras minúsculas ‘d’, ‘o’ o ‘g’.

[0-9]? => Busca una o ninguna coincidencia de un número.

[^a-z]? => Busca una o ninguna coincidencia de caracteres que no son letras minúsculas.
^colou?r$ => Busca color o colour.

^Nov(iembre)28(th)?$ => Busca ‘nov 28’, ‘noviembre 28, Nov 28th y Noviembre 28th


Suma +

El símbolo + se usa para buscar una o más coincidencias de un carácter que le precede. Por ejemplo:

[a]+ => Busca una o más coincidencias de la letra minúscula ‘a’.

[dog]+ =>Busca una o más coincidencias de la letra minúscula ‘d’, ‘o’ o ‘g’.

[548]+ => Busca una o más coincidencias del número ‘5’, ‘4’ o ‘8’.

[o-9]+ => Busca uno o más números.

[a-z]+ => Busca una o más letras minúsculas.

[^a-z]+ => Busca uno o más caracteres que no son letras minúsculas

[a-zA-z]+ => Busca cualquier combinación de letras mayúsculas o minúsculas.

[a-z0-9]+ => Busca cualquier combinación de letras minúsculas y números.

[A-Z0-9]+ => Busca cualquier combinación de letras mayúsculas y números.

[^7]+ => Busca cualquier carácter que no sea el número 7.


Multiplicación *

El símbolo * se usa para buscar cualquier número de coincidencias (incluido ninguna) del carácter que le precede.

Por ejemplo, 26* coincidiría con 2, 26, 266, 2666, 26666 etc.


Punto .

El símbolo . se usa para buscar un carácter sea del tipo que sea (cualquier carácter que se puede poner con un teclado que no sea un salto de línea (\n)).

Por ejemplo, la RegEx: Gato ., Pajaro2 coincidiría con:

Gato 1, Pajaro2
Gato A, Pajaro2
Gato 9, Pajaro2
Gato &, Pajaro2

pero no coincidirá con:

Gato 11, Pajaro2
Gato 1E, Pajaro2


Barra |

El símbolo | es la expresión lógica ‘o bien’ . Por ejemplo:

(Suyo|Suya) => Busca las cadenas ‘Suyo’ o ‘Suya’.

Suyo|Suya => Busca las cadenas ‘Suyo’ o ‘Suya’. Por ejemplo:

este gato es suyo
esta silla es suya
suyo o suya
suya o suyo


Barra inversa \

El símbolo \ es un carácter especial que elimina el significado normal de un carácter en una expresión regular. De este modo puedes convertir un metacaracter en un carácter normal y viceversa.

Por ejemplo:

La barra inclinada / en un expresión regular indica el principio o final de la expresión regular.

var a = /color/;

Si quieres que la RegEx entienda la barra inclinada como una barra inclinada tiene que añadirle la barra inversa \ par que así sea: \/

Por lo tanto, si quieres buscar el patrón /color/ en la cadena /tienda/coleccion/color/ tiene usar la RegEx: \/color

Otro ejemplo:

n es un carácter normal, pero si le añadimos la barra inversa antes, este se convierte en el metacaracter \n qué es un salto de línea.

Por lo tanto si quieres buscar un patrón que sea \n en la cadena cachopo\n1234 la expresión regular debería ser: cachopo\\n3456


Exclamación !

El símbolo ! es la expresión lógica de “no”, pero a diferencia del acento circunflejo ^ solo se usa al principio de una condición.

(!abc) => Busca una cadena que no sea ‘abc’.
[!0-9] => Busca un carácter que no sea un número.
[!a-z] => Busca un carácter que no sea una letra minúscula.


Llaves { }

Los símbolos { } se usan para buscar una más coincidencias con el carácter que le precede.

Es como el símbolo + pero ofrece más control sobre el número de coincidencias que quiere buscar.

Algunos ejemplos:

1{1} => Busca 1 coincidencia del carácter ‘1’.
Esta RegEx buscará 1.
1{2} => Busca 2 coincidencias del carácter ‘1’.
Esta RegEx buscará 11.
1{3} => Busca 3 coincidencias del carácter ‘1’.
Esta RegEx buscará 111.
1{1,4} => Busca de 1 a 4 coincidencias del carácter ‘1’.
Esta RegEx buscará 1, 11, 111 y 1111.
[0-9]{2} => Busca 2 coincidencias de un número, en otras palabras, busca números de 2 dígitos como 12
[0-9]{3} => Busca 3 coincidencias de un número, en otras palabras, busca números de 3 dígitos como 345
[0-9]{1,4} => Busca número de 1 a 4 dígitos.

[a]{1} => Busca 1 coincidencia del carácter ‘a’.
Esta RegEx buscará a.
[a]{2} => Busca 2 coincidencias del carácter ‘a’.
Esta RegEx buscará aa.
[a]{3} => Busca 3 coincidencias del carácter ‘a’.
Esta RegEx buscará aaa.

[a]{1,4} =>Busca de 1 a 4 coincidencias del carácter ‘a’.
Esta RegEx buscará a, aa, aaa y aaaa.
[a-z]{2} => Busca 2 coincidencias de letras minúsculas.
Esta RegEx buscará aa, bb, cc, etc.
[A-Z]{3} => Busca 3 coincidencias de letras mayúsculas.
Esta RegEx buscará AAA, BBB, CCC, etc.
[a-zA-Z]{2}
=> Busca 2 coincidencias de letras (minúscula o mayúscula).
Esta RegEx buscará aa, aA, AA, Aa, etc.
[a-zA-Z]{1,4} => Busca de 1 a 4 coincidencias de letras (minúscula o mayúscula).
Esta RegEx buscará aa, aA, aaaa,aAaA, aAAA etc.

(rock){1} => Busca 1 coincidencia de la cadena ‘rock’.
Esta RegEx buscará rock
(rock){2} => Busca 2 coincidencias de la cadena ‘rock’.
Esta RegEx buscará rockrock
(rock){3} => Busca 3 coincidencias de la cadena ‘rock’.
Esta RegEx buscará rockrockrock
(rock){1,4} => Busca de 1 a 4 coincidencias de la cadena ‘rock’.
Esta RegEx buscará rock, rockrock, rockrockrock, rockrockrockrock


Espacio en blanco

Para crear un espacio en blanco en RegEx solo tienes que dejar un espacio en blanco. Por ejemplo:.

(Ojete Calor) => Buscará la cadena ‘Ojete Calor’


Más ejemplos útiles

^(*\.html)$ => Busca cualquier tipo de carácter detrás de .html y los almacena en una variable.

^perro$ => Busca la cadena ‘perro’.

^a+$ => Busca una o más coincidencias de la letra minúscula ‘a’.

^(abc)+$ => Busca una o más coincidencias de la cadena ‘abc’.

^[a-z]+$ => Busca una o más coincidencias de una letra minúscula.

^(abc)*$ => Busca cualquier número de coincidencias de la cadena ‘abc’.

^a*$ => Busca cualquier número de coincidencias de la letra minúscula ‘a’.

^cursos* \.html$ => Encuentra todos los archivos que empiezan por ‘cursos’ y terminan por ‘.html’.

^*\.php$ => Encuentra todos los archivos con extensión ‘.php’.


Expresiones regulares para .htaccess

Es un módulo escrito en lenguaje de programación C que se usa en los servidores Apache a través del archivo .htaccess (que estoy seguro de que más de una vez has tocado :D).

A través de este archivo puedes hacer un montón de cosas (hay que tener mucho cuidado que es muy fácil tirar toda una web por un simple error de tipografía):

  • Redirecciones de URLs
  • Reescribir URLs
  • Bloquear usuarios de ciertos rangos de IP
  • Crear páginas 404 personalizadas
  • Mostrar contenido solo a ciertos rangos de IP

Tipos de directrices de configuración:

Existen 9 tipos diferentes, pero para lo que nos interesa solo veremos 2:

  1. RewriteEngine
  2. RewriteRule

RewriteEngine

Esta directriz se usa solo para activar o desactivar el módulo mod_rewrite.
Syntax: RewriteEngine on/off

Valor por defecto: RewriteEngine off

Lo primero que tenemos que hacer en el archivo .htaccess es activar el mod_rewrite con la siguiente línea de código:

Options +FollowSymLinks
RewriteEngine on

RewriteRule

Esta directriz se usa para decirle al servidor que interprete lo siguiente:

Sintaxis: RewriteRule [ETIQUETA]

Dónde ‘patrón’ es una expresión regular y ‘sustitución’ es una URL.

Las ETIQUETAS pueden ser: [R], [F], [NC], [QSA], [L], [OR] etc.

[R] => Redirect. El valor por defecto es 302, pero se puede cambiar a 301 (que es lo que a nivel SEO interesa el 99% de las veces).

RewriteRule ^index\.html$ /index.php [r=301]

[F] => Forbidden (prohibido). Se usa normalmente con un guión (-). El guión le dice al servidor que no haga ninguna sustitución. Esta etiqueta le dice al servidor que no complete la petición y que devuelva un código ‘403’.

RewriteRule ^precio-producto\.php$ -[F]

[NC] => Le dice al servidor que ignore si las letras son mayúsculas o minúsculas.

RewriteRule ^him*\.php$ [nc]

[L] => Last rule. Le dice al servidor que no procese más reglas a partir de esta.

[OR] => Expresión ‘o bien’. Esta etiqueta se usa como un ‘o bien” en Rewritecond.


Ejemplos útiles

Ejemplo 1: Redirigir todas las páginas de la carpeta ‘/cachopo/’ a ‘cachopo.html’.


RewriteRule ^cachopo/$ /cachopo.html [r=301,l]

Ejemplo 2: Redirigir la página ‘urlvieja.html’ a la página ‘newaddress.html’


RewriteRule ^oldaddress\.html$ /newaddress.html [r=301,l]

Ejemplo 3: Redirigir tu web a otra web


Redirect 301 https://www.otrawebmejor.com

Ejemplo 4: Redirigir ‘cachopo.com/index.html’ a ‘www.cachopo.com’

RewriteCond %{REQUEST_URL} ^index\.html$
RewriteRule ^(.*)$ https://www.cachopo.com/$1 [r=301, l]

Ejemplo 5: Bloquear a un usuario de la IP 12.34.56.78 para que no vea ‘precios-cachopo.html’


RewriteCond %{REMOTE_ADDR} ^12\.34\.56\.78$
RewriteRule ^precios-cachopo\.html$ /sorry.html -[F]

Ejemplo 6: Bloquear a un usuario de la IP 12.34.56.78 para que no vea tu web www.cachopo.com


RewriteCond %{REMOTE_ADDR} ^12\.34\.56\.78$
RewriteRule ^.*$ / -[F]

Ejemplo 7: Redirigir con 301 de una carpeta a otra

Redirect 301 /carpeta1.html https://www.ejemplo.com/carpeta2.html

Ejemplo 8: Crear una página 404 personalizada

Tienes que crear una nueva página en tu web como página 404 que se llame (por ejemplo) ‘404.php’ y luego subirla a la raíz del servidor de tu web. Después tienes que añadir este código al archivo .htaccess:


Options +FollowSymLinks
RewriteEngine on
ErrorDocument 404 https://www.ejemplo.com/404.php

Ejemplo 9: Bloquear a una IP para que no acceda a tu web:


Options +FollowSymLinks
RewriteEngine on
Order Deny, Allow
Deny from 61.16.153.67

Y si quieres bloquear dos IPs diferentes:


Options +FollowSymLinks
RewriteEngine on
Order Deny, Allow
Deny from 61.16.153.67
Deny from 124.202.86.42


Hay muchísimo más sobre lo que puedes aprender de expresiones regulares, pero a nivel SEO y Google Analytics me ha parecido que esto es lo más útil y fácil de aprender. Ahora cuando un compañero se esté peleando con un filtro de Google Analytics podrás acudir como el héroe que eres:

regular-expressions2

Comic extráido de la web de xkcd

Si tienes cualquier duda no dudes es escribirme, ya sea a través de un comentario o través del formulario de contacto.

Fuentes:

Cómo todo esto no me lo he sacado yo de la manga aquí te dejo un listado de los artículos que he leído para escribir este:

Si te ha gustado comparte... ¡No seas egoísta!