PHP y expresiones regulares: una introducción

Comentarios: 7
Tags: ,
Fecha: 01/12/2008

Las expresiones regulares nos dotan de los fundamentos o las bases para describir o buscar coincidencias de acuerdo de unas reglas de sintaxis predefinidas. Una expresión regular es un patrón de caracteres que comparamos con una determinada cadena o parcela de texto. La estructura de una expresión regular es similar a una típica expresión aritmética: varios elementos son combinados para conseguir una expresión más compleja. El potencial de las expresiones regulares se basa en esto, en poder realizar múltiples combinaciones de los distintos elementos que la pueden conformar. PHP permite dos tipos de funciones para expresiones regulares: las de tipo ereg (Expresiones regulares POSIX) y las de tipo preg (Compatibles con Perl).

Bien, comencemos con el ejemplo más sencillo de expresión regular: un solo caracter. Si tuvieramos una expresión regular formada por ejemplo con la letra a, ésta coincidiría con "patata", "libertad" o "intensidad" y en cambio no coincidiría con "pueblo" o "torpe". El ejemplo es claro, palabras con la letra a son coincidentes con nuestro mini patrón o expresión regular conformada únicamente por el caracter a.

Operador |
También podemos comprobar diversas expresiones regulares simultaneamente usando el caracter |. Sería similar a un "OR", en x|y buscaría una coincidencia en x o y y devolvería cierto en cualquiera de los dos casos. Por ejemplo 2|3 buscaría en la cadena a comparar el número 2 y el 3 y resultaría coincidente cuando encontrase uno de los dos números. De este modo:
4562 mostraría coincidencia.
23 mostraría coincidencia.
379 mostraría coincidencia.
45 no mostraría coincidencia.

Operador []
Los corchetes se usan para representar una lista o rango de caracteres que han de coincidir. Por ejemplo:

  • [0-9] coincide con cualquier dígito comprendido entre 0 y 9.
  • [a-z] coincide con cualquier caracter en minúscula de la a a la z.
  • [A-Z] coincide con cualquier caracter en mayúsculas de la A a la Z.
  • [A-Za-z] coincide con cualquier caracter de la a a la z, independientemente de si está en mayúsculas o minúsculas.

Cabe destacar también que se pueden especificar rangos en ASCII.

Cuantificadores
Algunas veces necesitaremos crear expresiones que busquen caracteres basándose en su frecuencia o en su posición. Por ejemplo:

  • m+ coincide con cualquier cadena que contiene al menos una m.
  • m* coincide con cualquier cadena que contiene 0 o más m.
  • m? coincide con cualquier cadena que contiene 0 o 1 m.
  • m{2} coincide con cualquier cadena que contiene una secuencia de dos m. "Mama" no coincidiría, en cambio "emmental" sí.
  • m{2,3} coincide con cualquier cadena que contiene una secuencia de dos o tres m.
  • m{2,} coincide con cualquier cadena con una secuencia de al menos 2 m.
  • m$ coincide con cualquier cadena con una m al final de la misma.
  • ^m coincide con cualquier cadena con una m al inicio de la misma.
  • [^a-zA-Z] coincide con cualquier cadena que no contiene caracteres de la a a la z y de la A a la Z.
  • m.m coincide con cualquier cadena que contiene una me, seguida de cualquier caracter, seguido de otra m.

La chuleta de patrones vista hasta ahora, y que nos puede servir como resumen, sería:

c — Caracter c no especial. Casa consigo mismo.
X$ — Finalizar con X.
X* — X cero o más veces.
. — Un caracter indivudual cualquiera.
[c1c2c3] — Conjunto de caracteres. Casa si c1 o c2 o c3.
[^c1c2c3] — Casa con caracteres distintos de c1, c2 o c3.
[c1-c2] — Rango de caracteres. Casa con cualquier caracter entre c1 y c2.
[^c1-c2] — Casa con caracteres no comprendidos entre c1 y c2.
XY — Concatenación. Casa si X va seguido de Y.
X+ — X una o más veces.
X? — X cero o una vez.
(X) — Agrupa X. (Además, en JavaScript, graba en RegExp.$1...).
X|Y — Alternativa. Casa X o Y.
X{n} — X exactamente n veces.
X{n,} — X al menos n veces.
X{m,n} — X de m a n veces.

También podemos combinar los patrones vistos hasta el momento para formar expresiones más complejas. Por ejemplo:

  • ^.{2}$ coincide con cualquier cadena que contiene exactamente 2 caracteres.
  • <b>(.*)</b> coincide con cualquier cadena encerrada dentro de <b> y </b>.
  • p(hp)* coincide con cualquier cadena que contiene una p seguida por cero o más instancias de la secuencia hp.

Si uno desea buscar por uno de estos caracteres especiales puede hacerlo utilizando la barra \, que se usa como escape. Por ejemplo si deseamos buscar cantidades en dolares es probable que deseemos realizar una busqueda del signo $, como este signo forma parte la sintaxis propia de las expresiones regulares, debe ser escapado para ser utilizado en la búsqueda. De este modo, la expresión ([\$])([0-9]+) buscaría el signo del dolar seguido de uno o mas números.

Rangos de caracteres predefinidos.
Existen una serie rangos de caracteres predefinidos llamados clases de caracteres que nos pueden facilitar la tarea a la hora de construir nuestros patrones. Algunos de estos rangos son:

  • [:alpha:]: Letras en mayúscula o minúscula. Sería el equivalente a [A-Za-z].
  • [:alnum:]: Letras en mayúscula o minúscula y números. Sería el equivalente a [A-Za-z0-9].
  • [:digit:]: Números. Sería el equivalente a [0-9].
  • [:graph:]: Caracteres imprimibles encontrados en el rango ASCII de 33 a 126.
  • [:lower:]: Letras minúsculas. Sería el equivalente a [a-z].
  • [:punct:]: Caracteres de puntuación, incluyendo ~ ` ! @ # $ % ^ & * ( ) - _ + = { } [ ] : ; ' < > , . ? y /.
  • [:upper:]: Letras mayúsculas. Sería el equivalente a [A-Z].
  • [:space:]: Caracteres en blanco, incluyendo espacios, tabulaciones horizontales y verticales, nuevas líneas o retornos de carro.
  • [:xdigit:]: Caracteres hexadecimales. El equivalente a [a-fA-F0-9].

función ereg()
La función ereg() se utiliza para buscar coincidencias de expresiones regulares. La sintaxis es:

ereg($pattern, $string [,$regs ])

Busca en string las coincidencias con la expresión regular pattern. Si se encuentran coincidencias con subcadenas entre paréntesis de pattern y la función se ha llamado con el tercer argumento regs, las coincidencias se almacenarán en los elementos de regs. La búsqueda diferencia mayúsculas y minúsculas. Devuelve un valor verdadero si se encontró alguna coincidencia, o falso in no se encontraron coincidencias u ocurrió algún error.

Por ejemplo:

<?php
if (ereg( "[A-Z]", "juan" ) ) {
echo "Ok";
} else {
echo "Por favor, el nombre en mayusculas";
}
?>

Nos devolvería:

Por favor, el nombre en mayusculas

El siguiente filtra etiquetas HTML:

<?php
if (ereg( "</?[a-z][a-z0-9]*[^<>]*>", "<script>" ) ) {
echo "No se admiten etiquetas";
} else {
echo "OK";
}
?>

Busca un formato de fecha dd/mm/yyyy:

<?php
if (ereg( "(0[1-9]|[12][0-9]|3[01])[/](0[1-9]|1[012])[/](19|20)[0-9]{2}", "10/12/2008" ) ) {
echo "Fecha correcta";
} else {
echo "No es un formato de fecha correcto";
}
?>

Algunas entradas relacionadas:

1 alrevez

Hola que bueno que estes de regreso, y gracias por este post sobre la expresiones regulares, yo quisiera saber si hay algúna expresión regular que busque caracteres independiente de de los acentos, por ejemplo si la persona escribe raton, lo encuentre asi el texto a buscar sera ratón.

gracias
2 Oriol
http://www.6cubdesigns.com

Un magnífico artículo para aquellos que como yo, andábamos algo flojos de expresiones regulares y todas sus características.

Directo a mi delicious. :D
3 typo3dev
http://www.addedbytes.com/cheat-sheets/regular-expressions-cheat-sheet/

Interesante artículo, yo ya hace algun tiempo que utilizo las expresiones regulares para hacer cambios de diseños a un gran numero de páginas. Te puede ahorra mucho tiempo. En el link encontrareis una referencia muy buena y muy util para el desarrollo
4 RoninRojo
http://www.freakevolution.com

Genial, nunca me sobran los tutoriales sobre expresiones regulares. Espero que haya un segundo artículo!

Gracias y n saludo!
5 Francisco
http://www.webintenta.com

Hola alrevez.
En principio puedes utilizar [:alpha:]. Mostrará coincidencia tanto si escribes raton como ratón.

Saludos.
6 Andrés
http://www.disegnocentell.com.ar

Muy buena referencia. Sólo un pero: En PHP 6 la expresiones POSIX serán obsoletas, de manera que ya conviene ir olvidándose de ereg y compañía, junto con los rangos predefinidos.
7 Francisco
http://www.webintenta.com

Estoy preparando una segunda parte con la terminología Perl -que es muy parecida a la POSIX-, pero esta me servía de introducción y de esta forma doy una visión global sobre el tema.

No sabía que en PHP se quedarán obsoletas. Aunque supongo que seguirán siendo soportadas durante bastante más tiempo.

Saludos.

¡Gracias por dejar tu opinión! Por favor procura que tu comentarios sean apropiados al tema tratado en la entrada; que no sean spam, u ofensivos, de otro modo, serán eliminados.

Si deseas realizar algún comentario, crítica o sugerencia sobre la propia web o deseas contactar conmigo lo puedes hacer a través de la siguiente dirección de correo: webintenta@webintenta.com

El hombre nunca sabe de lo que es capaz hasta que lo intenta.Dickens, Charles
Pixer.us

Pixer.us es un servicio web que nos ofrece opciones sencillas de edición de imágenes, como modificar el tamaño o recortarlas. También podremos añadirle unos cuantos efectos básicos. Para utilizar este servicio tan sólo tenemos que subir nuestra imágen haciendo click en el botón de “Examinar” y luego en el de “Upload & Edit”. Una vez hemos realizado las modificaciones tendremos la opción de guardar la imagen en alguno de los siguientes formatos: JPEG, GIF, BMP o PNG.

7 Poderosos carruseles de imágenes para diseñadores

Este post es una colección de algunos de los mejores carruseles de imágenes y contenido que podemos utilizar para nuestros proyectos web. El listado incluye Agile Carousel, YUI Carousel, JCarousel, iCarousel (jQuery + MooTools) y un tutorial acerca de cómo implementar un carrusel como los de Flickr utilizando Prototype-UI.

Listado de editores de PHP

Listado que aglutina la mayoría de editores de PHP que existen en la actualidad. El listado está dividido en editores gratuitos -con una subdivisión por sistema operativo- y editores comerciales. Interesante enlace.

50 lecciones acerca de teoría del diseño

Desde Psdtuts+ nos ofrecen 50 lecciones acerca de teoría del diseño gráfico. Si bien muchas veces nos enfocamos en el cómo de las cosas, cómo conseguir un efecto, cómo realizar una retícula en css,... también resulta muy importante entender el "por qué". Lecciones acerca de tipografía, psicología del color, composición, etc. Las lecciones están en inglés.

BonkEnc extrae, codifica y convierte archivos de audio

BonkEnc es una utilidad para extraer las pistas de audio de los CDs, codificar y convertir los archivos de audio a múltiples formatos. Es capaz de generar archivos en formato MP3, MP4 /M4A, Ogg Vorbis, AAC, y FLAC. Y dispone de su propio códec de sonido, Bonk. Además es compatible con CDDB (Compact Disc Database) y CDText

Times Reader: el New York Times en Adobe AIR

El prestigioso New York Times ha lanzado una aplicación, llamada Times Reader, basada en Adobe AIR, que permite leer las noticias de un modo más parecido a lo que sería un periódico en papel. Parece que la crisis de los medios escritos hace que se abran a nuevos modelos de negocio.

Appetizer

Appetizer es una aplicación gratuita para Windows que funciona como lanzador de aplicaciones. Permite organizar los accesos directos y carpetas que más a menudo utilizemos en una cómoda barra o "dock" . Entre sus características cabe destacar que tiene soporte para plugins; para pieles; teclas de acceso rápido; apoyo a iconos personalizados; etc. También es muy interesante mencionar que el programa posee una versión portable del mismo.

How To Create A Great Web Design CV and Resume?

Aprovechando que están cayendo chuzos de punta en el mundo laboral, en Smashing Magazine se han marcado un muy interesante artículo sobre como crear un buen currículum vitae.

13 trucos para Google Reader

Una interesante recopilación de recursos y recetas para sacar un mayor partido a Google Reader: atajos de teclado, uso de filtros, utilizar las notas,...