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:
<em>alnum: "[[:alnum:]]"</em> concuerda con cualquier cadena que contenga caracteres alfanuméricos. <em>digit: "[[:digit:]]"</em> cualquier cadena que contenga caracteres numéricos. <em>space: "[[:space:]]"</em> cualquier cadena que contenga espacios. <em>alpha: "[[:alpha:]]"</em> 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 = "http://www.htmlwizard.net"; $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[i]_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).


