Volver al índice Expresiones regulares


Expresiones regulares en PHP

Las expresiones regulares permiten definir patrones de coincidencia y aplicarlas a cadenas de texto para saber si la cadena (o parte de ella) cumple el patrón e incluso realizar transformaciones de la cadena.

En PHP existen dos sistemas de expresiones regulares:

Volver al principio


Funciones de expresiones regulares ...

... POSIX extendido

Las funciones básicas de expresiones regulares POSIX extendido para comparar una cadena con un patrón son ereg($patron, $cadena) y eregi($patron, $cadena). La diferencia entre ellas es que ereg() distingue entre mayúsculas y minúsculas y eregi() no. Estas funciones comprueban si la cadena cumple el patrón y devuelven el valor 1 (verdadero) o 0 (falso). Los argumentos de las funciones pueden ser cadenas o variables que contengan cadenas. Si el patrón es la cadena vacía, las funciones devuelven error.

<?php
$cadena1 = "1234567";
$cadena2 = "abcdefg";
$patron = "^[[:digit:]]+$";

if (eregi($patron, $cadena1)) {
    print "<p>La cadena $cadena1 son sólo números.</p>\n";
} else {
    print "<p>La cadena $cadena1 no son sólo números.</p>\n";
}

if (eregi($patron, $cadena2)) {
    print "<p>La cadena $cadena2 son sólo números.</p>\n";
} else {
    print "<p>La cadena $cadena2 no son sólo números.</p>\n";
}
?>
La cadena 1234567 son sólo números.
La cadena abcdefg no son sólo números.

Faltan las funciones de búsqueda y sustitución

Volver al principio


... compatibles con Perl

La función de expresiones regulares compatibles con Perl preg_match($patron, $cadena [, $matriz_coincidencias [, $modificadores [, $desplazamiento]]]) compara una cadena con un patrón y devuelve 1 si el patrón ha coincidido o 0 si no. La primera coincidencia encontrada se puede guardar en el argumento opcional $matriz_coincidencias y, si se añade el modificador PREG_OFFSET_CAPTURE, se guarda también en el argumento opcional $matriz_coincidencias la posición de la coincidencia encontrada. El argumento opcional $desplazamiento es un número que permite indicar en qué carácter se inicia la búsqueda.

<?php
$cadena1 = "1234567";
$cadena2 = "abcdefg";
$patron = "/^[[:digit:]]+$/";

if (preg_match($patron, $cadena1)) {
    print "<p>La cadena $cadena1 son sólo números.</p>\n";
} else {
    print "<p>La cadena $cadena1 no son sólo números.</p>\n";
}

if (preg_match($patron, $cadena2)) {
    print "<p>La cadena $cadena2 son sólo números.</p>\n";
} else {
    print "<p>La cadena $cadena2 no son sólo números.</p>\n";
}
?>
La cadena 1234567 son sólo números.
La cadena abcdefg no son sólo números.

La función de expresiones regulares compatibles con Perl preg_match_all($patron, $cadena [, $matriz_coincidencias [, $modificadores [, $desplazamiento]]]) compara una cadena con un patrón y devuelve el número de coincidencias encontradas. Las coincidencias encontradas se pueden guardar en el argumento opcional $matriz_coincidencias y, si se añade el modificador PREG_OFFSET_CAPTURE, se guardan también en el argumento opcional $matriz_coincidencias la posición de cada coincidencia encontrada. El argumento opcional $desplazamiento es un número que permite indicar en qué carácter se inicia la búsqueda.

<?php
$cadena = "Esto es una cadena de prueba";
$patron = "/de/";
$encontrado = preg_match_all($patron, $cadena, $coincidencias, PREG_OFFSET_CAPTURE);

if ($encontrado) {
    print "<pre>"; print_r($coincidencias); print "</pre>\n";

    print "<p>Se han encontrado $encontrado coincidencias.</p>\n";
    foreach ($coincidencias[0] as $coincide) {
        print "<p>Cadena: '$coincide[0]' - Posición: $coincide[1]</p>\n";
    }
} else {
    print "<p>No se han encontrado coincidencias.</p>\n";
}
?>
Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [0] => de
                    [1] => 14
                )

            [1] => Array
                (
                    [0] => de
                    [1] => 19
                )

        )

)

Se han encontrado 2 coincidencias.
Cadena: 'de' - Posición: 14
Cadena: 'de' - Posición: 19

Faltan las funciones de búsqueda y sustitución

Volver al principio


Sintaxis de las expresiones regulares...

... POSIX extendido

Patrón Significado
. cualquier carácter
^c empezar por el carácter c
c$ terminar por el carácter c
c+ 1 o más caracteres c
c* 0 o más caracteres c
c? 0 o 1 caracteres c
\n nueva línea
\t tabulador
\ escape, para escribir delante de caracteres especiales: ^ . [ ] % ( ) | * ? { } \
(cd) caracteres c y d agrupados
c|d caracter c o d
c{n} n veces el carácter c
c{n,} n o más carácteres c
c{n,m} desde n hasta m caracteres c
[a-z] cualquier letra minúscula
[A-Z] cualquier letra mayúscula
[0-9] cualquier dígito
[cde] cualquiera de los carácteres c, d o e
[c-f] cualquier letra entre c y f (es decir, c, d, e o f)
[^c] que no esté el caracter c
[[:alnum:]] cualquier letra o dígito (pero no vocales acentuadas, ñ, ç, etc.)
[[:alpha:]] cualquier letra (pero no vocales acentuadas, ñ, ç, etc.)
[[:digit:]] cualquier dígito
[[:lower:]] cualquier letra minúscula (pero no vocales acentuadas, ñ, ç, etc.)
[[:punct:]] cualquier marca de puntuación
[[:space:]] cualquier espacio en blanco
[[:upper:]] cualquier letra mayúscula (pero no vocales acentuadas, ñ, ç, etc.)

Volver al principio

... compatibles con Perl

Los patrones deben empezar y acabar con un delimitador, que normalmente es la barra (/), En caso de que la barra forme parte del patrón, se puede:

Los patrones compatibles con Perl admiten en general los patrones POSIX extendidos comentados en el punto anterior, con una diferencia muy importante que es que las clases que incluyen carácteres alfabéticos ([[:alnum:]], [[:alpha:]], etc.) en POSIX no incluyen vocales acentuadas, ñ, ç, etc, mientras que en PECR sí.

Además, los patrones compatibles con Perl admiten los siguientes patrones:

Patrón Significado
[[:alnum:]] cualquier letra o dígito (incluidas vocales acentuadas, ñ, ç, etc.)
[[:alpha:]] cualquier letra (incluidas vocales acentuadas, ñ, ç, etc.)
[[:ascii:]] carácteres con código ASCII de 0 a 127
[[:blank:]] espacios o tabuladores
[[:cntrl:]] carácteres de control
[[:graph:]] carácteres de impresión, salvo el espacio
[[:lower:]] cualquier letra minúscula (incluidas vocales acentuadas, ñ, ç, etc.)
[[:print:]] carácteres de impresión, espacio incluido
[[:upper:]] cualquier letra mayúscula (incluidas vocales acentuadas, ñ, ç, etc.)
[[:word:]]
cualquier letra o dígito y el guión bajo (incluidas vocales acentuadas, ñ, ç, etc.)
[[:xdigit:]] cualquier dígito hexadecimal
\w cualquier letra o dígito y el guión bajo (incluidas vocales acentuadas, ñ, ç, etc.)
\W cualquier cosa que no sea letra o dígito y el guión bajo (incluidas vocales acentuadas, ñ, ç, etc.)
\s cualquier espacio en blanco
\S cualquier cosa que no sea un espacio en blanco
\d cualquier dígito
\D cualquier cosa que no sea un dígito
\b inicio o final de palabra
\A comienzo
\Z final (incluido salto de línea)
\z final

Los patrones de expresiones regulares compatibles admiten modificadores, que se incluyen en el patrón, después del limitador final.

Volver al principio


Ejemplos de expresiones regulares ...

... POSIX extendido

Patrón Cadena ¿Cumple? Comentario
abc awbwc No Los caracteres tienen que estar seguidos.
34abc No importa que hayan caracteres antes...
cbabcba ... o después.
a2b g1da2b3 Las expresiones regulares detectan letras, números, ...
áb 3áb4 ... incluso acentos, ...
a\$b 1a$b2 ... salvo los caracteres ^ . [ $ ( ) | * + ? { \ €
que deben llevar una contrabarra \ antes,
además de \n (nueva línea) y \t (tabulador)
[aeiou] bic Los corchetes definen los caracteres admitidos en una posición ...
bcd No
[^aeiou] bic ... o no admitidos
aei No
[p-t] avr Se pueden definir rangos de caracteres...
av1 No
[B-D] PMD ... en minúsculas o mayúsculas ...
AV1 No
[0-9] b9d ... o números
bcd No
[[:alpha:]] Cualquier carácter alfabético (sin acentos)
[[:digit:]] Cualquier número
[[:alnum:]] Cualquier número o carácter alfabéticos (sin acentos)
[[:punct:]] Cualquier carácter que no sean letras y números (menos el euro)
[[:space:]] Cualquier tipo de espacio en blanco
[[:upper:]] Cualquier mayúscula (sin acentos)
[[:lower:]] Cualquier minúscula (sin acentos)
^ab cab No Los caracteres tienen que estar al principio
abc No importa que hayan caracteres después
ab$ abc No Los caracteres tienen que estar al final
cab No importa que hayan caracteres antes
^ab$ ab Tiene que empezar y acabar por aba ...
abab No ... y no puede haber nada antes o después
ab?c abcde El carácter b puede estar entre a y c...
acde ... o no estar entre a y c ...
adcde No ... pero no puede haber otro carácter
a.c abc El . representa cualquier carácter ...
a c ... incluso el espacio el blanco, ...
abdc No pero sólo un carácter
ab+c abcde El carácter b puede estar una vez...
abbbcde ... o varias ...
acde No ... pero tiene que estar al menos una vez.
ab*c abcde El carácter b puede estar una vez...
abbbcde ... o varias ...
acde ... o ninguna.
ab{3}c abbbc Las llaves indican el número exacto de repeticiones del carácter, ...
abbbbc No ... no puede haber más ...
abbc No ... ni menos.
ab{2,4}c abc No Se pueden definir rangos con límite inferior e inferior
abbc
abbbc
abbbbc
abbbbbc No
ab{2,}c abc No Se pueden definir rangos sin límite superior
a(bc){2}d abcbcd Los paréntesis definen agrupaciones de carácteres.
En este caso bc tiene que aparecer repetido
a(bc)?d abcd Aquí bc puede estar ...
ad ... o no estar, ...
abd No ... pero no puede aparecer sólo la b, o sólo la c u otro carácter
a(b|d)c abc Entre la a y la c puede estar el carácter b...
adc ... o el carácter d, ...
abdc No ... pero no los dos, ...
ac No ... ni ninguno de ellos.
^(ab)|(dc)$ abc Está la pareja ab ...
adc ... o dc ...
abdc ... o las dos, ...
ac No ... pero no ninguna
^(ab)$|^(dc)$ abc No Está la pareja ab, pero sobra la c ...
adc No ... o está la pareja dc, pero sobra la a.
dc Está una de las dos

Volver al principio

Autor: Bartolomé Sintes Marco
Última modificación: 9 de febrero de 2007