Expresiones regulares en PHP
Introducción:
La manipulación de cadenas es parte de la vida diaria de un desarrollador de webs:
- Validar entradas del usuario.
- Buscar caracteres dentro de cadenas.
- Comparar cadenas.
Las expresiones regulares pueden hacer mucho más facil esta tarea, cuando comprendas como aplicarlas correctamente. Admito que la mayor parte de las expresiones regulares paracen un poco endiabladas en un primer vistazo, pero intentaremos, en este documento, que salgas airoso de este
primer encuentro.
Como ya deberÃas saber, utilizando expresiones regulares puedes saber si una cadena concuerda con un patrón especÃfico o si una cadena contiene una subcadena que cumpla un determinado patrón.
Las expresiones regulares soportadas por PHP cumplen con el estándar POSIX y están implementadas a través de la biblioteca regex de Henry Spencer. Tienen algunas diferencias con respecto a la implementación que hace Perl, tenlo en cuenta cuando busques información adicional
acerca de este tema.
Sintáxis de las expresiones regulares:
Empecemos por lo más facil: "abc"
Una expresión regular válida consiste en una o más ramas, separadas por "|".
La expresión resultará concordante con cualquier cosa que concuerde con una de sus ramas. Por tanto la expresión "abc" será concordante con cualquier cadena que contenga "abc".
Es estúpido utilizar ereg para este propósito tan simple. Puedes usar strstr() en su lugar.
La expresión regular "abc|def" concordará con cualquier cadena que contenga "abc" o "def".
Una rama consiste en una o más piezas. Una pieza es un conjunto de cosas relevantes.
Veamos el siguiente ejemplo: "[abc]"
Esto es denominado una expresión acorchetada (bracket expression), seguramente por que está englobada por corchetes. Como los corchetes especifican un conjunto de caracteres, no una cadena, esta expresión concordará con cualquier cadena que contenga "a", "b" o "c".
Si dos caracteres en esta lista estuviesen separados por "-", estarÃamos indicando el rango completo de caracteres entre los dos especificados, ambos inclusive:
"[0-9]" concuerda con cualquier cáracter numérico,
"[a-Z]" concuerda con cualquier carácter desde la "a" minúscula hasta la "Z" mayúscula.
Consejo: Para especificar un guión literal como parte de tu conjunto de caracteres, escrÃbelo en la
última posición del mismo: "[abc-]".
Si un conjunto empieza con "^" (Por ejemplo: "[^abc]"), concordará con cualquier carácter no presente en dicho conjunto.
Puedes utilizar un ciertas abreviaturas para especificar clases de carácteres.
Las clases más utilizadas son:
alnum: "[[:alnum:]]" concuerda con cualquier cadena que contenga caracteres alfanuméricos.
digit: "[[:digit:]]" cualquier cadena que contenga caracteres numéricos.
space: "[[:space:]]" cualquier cadena que contenga espacios.
alpha: "[[:alpha:]]" cualquier cadena que contenga caracteres alfabéticos.
Las expresiones acorchetadas y los caracteres ordinarios pueden ir seguidos de "+", "*", "?" o de un aglutinante (bound):
"a+" concuerda con cualquier cadena que contenga al menos una "a".
"a*" cero o más ocurrencias de "a".
"a?" cero o más ocurrencias de "a".
"a{2}" una secuencia de dos "a".
"a{2,4}" una secuencia de dos a cuatro "a".
Existen algunos caracteres especiales que puedes utilizar en las expresiones regulares de POSIX:
".": concuerda con un sólo carácter, cualquiera que sea.
"^": el comienzo de la cadena.
"$": el final de la cadena.
Consejo: Para utilizar estos caracteres como caracteres ordinarios debes prefijarlos con la secuencia de escape ".^?".
Ya podemos construir algunas expresiones regulares útiles:
"^[[:alnum:]]{4}$": Una cadena conteniendo exáctamente cuatro caracteres alfanuméricos.
"^[^@[:space:]]+@[^@[:space:]]+$": Esta expresión concuerda con cualquier cadena que contenga cualquier carácter excepto "@" y " " (Espacio) antes de una "@" (arroba) y lo mismo después de una "@".
"[^.]*$": Concuerda con todos los caracteres al final de una cadena y antes de ".".
Nótese que la sintaxis de las expresiones regulares es muy promiscua.
Esto quiere decir que intenta concordar tantas veces como sea posible:
echo ereg_replace("<.*>", "", "Test");
Esto no eliminará todos los tags HTML como cabrÃa esperar, pero retornará una cadena vacÃa: Reemplaza "<" seguido por cualquier carácter (incluyendo ">") hasta el final de la cadena.
La forma correcta para hacerlo serÃa algo asÃ:
echo ereg_replace("<[^>]*>", "", "Test");
Usando expresiones regulares en las funciones de PHP:
En PHP, cinco funciones utilizan expresiones regulares: ereg(), eregi(), ereg_replace(), eregi_replace() y split().
Con ereg y eregi puedes buscar coincidencias en una cadena. La mayor parte de las veces las utilizarás para validar datos:
$password = "foobar";
if (!eregi("^[[:alnum:]]{4, 6}$", $password))
echo "Contraseña con sintáxis incorrecta: Deben ser de cuatro a seis caracteres alfanuméricos.";
La siguiente expresión regular extrae el dominio de una URL:
$url = "
Para ver este enlace Registrate o Inicia Sesion";
$tld = ereg("([^.]*$)", $url, $regs);
echo $regs[1];
Todas las concordancias a las expresiones agrupadas por "()" son añadidas al array opcional [regs] pasado a la función.
ereg
_replace() se utiliza para reemplazar concordancias con una expresión regular. Su utilización
es la siguiente:
$string = "foo-bar";
$string = ereg_replace("^[^-]*", "bar", $string);
// $string es ahora "bar-bar"
echo $string;
Esto sustituye cualquier cosa antes de "-" con "bar".
Existe una extensión muy util a esta funciona: los back-ticks.
Con esta funcionalidad puedes utilizar la concordancia encontrada en tu cadena de sustitución:
$string = "foo-bar";
$string = ereg_replace("(^[^-]*)", "1bar", $string);
// $string is now "foobar-bar"
echo $string;
Básicamente esto es lo mismo que usar la funcionalidad del array de ereg, pero en lugar de tener concordancias añadidas a un array, haces referencia a ellas con "1", "2", etc.
Con todo lo dicho tienes un buen punto de partida para trabajar con expresiones regulares. Además puedes echar un vistazo a la siguiente bibliografÃa:
man re_format - POSIX 1003.2 regular expressions.
Mastering Regular Expressions: Powerful Techniques for Perl and Other
Tools (Nutshell Handbook).