destacados

Gabriel Da Silva

Portafolio del ilustrador y director de arte brasileño, aunque afincado en Madrid, Gabriel Da Silva.

B&W Helmut Newton

Selección de fotografías en blanco y negro de uno de los fotógrafos más conocidos de las últimas décadas, Helmut Newton.

Judith Erwes

Fotógrafa afincada en Londres con un estilo que combina la moda, el humor y la estética retro.

Jody Rogac

Nacida en Inglaterra y criada en Canadá, Jody Rogac en la actualidad vive y trabaja en Brooklyn. Sus trabajo ha obtenido diversos galardones.

Publicaciones

PHP y expresiones regulares: una introducción

, 01/12/2008 16:00:00

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";
}
?>
Páginas: 1
comentarioscomentarios