Entrada

expresiones regulares 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.

PHP permite dos tipos principales de funciones para expresiones regulares: las de tipo ereg (Expresiones regulares POSIX) y las de tipo preg (Compatibles con Perl). Son muy similares, aúnque las segundas llegan a ser algo más potentes.

Ejemplo de Expresiones regulares compatibles con Perl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?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";
}
?>

resultado

1
2
La cadena 1234567 son sólo números.
La cadena abcdefg no son sólo números.

La función preg_match() distingue entre mayúsculas y minúsculas. Para que no distinga, debe añadirse el modificador “i” (sin comillas) al final del patrón. Este modificador no afecta las clases [[::]].

Patrones:

Patrón Significado
c carácter c
. 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 carácter c o d
c{n} n veces el carácter c
c{n,} n o más caracteres 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 caracteres c, d o e
[^c] que no esté el carácter c
[[:alnum:]] cualquier letra o dígito
[[:alpha:]] cualquier letra
[[:digit:]] cualquier dígito
[[:lower:]] cualquier letra minúscula
[[:punct:]] cualquier marca de puntuación
[[:space:]] cualquier espacio en blanco
[[:upper:]] cualquier letra mayúscula

Ejemplo de Expresiones regulares POSIX

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?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";
}
?>

Resultado:

1
2
La cadena 1234567 son sólo números.
La cadena abcdefg no son sólo números.

Funciones tipo POSIX

  • ereg(). Devuelve true si se cumple el patrón, o false si no se cumple.
  • eregi(). Igual que ereg(), pero sin distinguir mayúsculas y minúsculas
  • ereg_replace(). Usando la potencia de las expresiones regulares, permite modificar una cadena de texto.
  • eregi_replace(). Igual que la anterior, sin distinguir minúsculas y mayúsculas.
  • split(). Divide una cadena en un array, según un patrón REGEX. Hace la misma tarea que la función explode, pero indicando una expresión regular como separador.
  • spliti(). Igual que el anterior, sin diferenciar minúscula y mayúscula.

Para tratar cadenas en UTF8 hay que usar las funciones mb_xxx por ejemplo en este caso mb_ereg(), etc..

Funciones tipo PCRE

  • preg_match(). Chequea el patrón en una cadena alfanumérica. Devuelve true si coincide, o false en caso contrario. Además captura las coincidencias en un array.
  • preg_match_all(). Igual que preg_match, pero almacenando todas las subcadenas que coincidan con el patrón (no sólo una como es el caso de preg_match)
  • preg_replace(). Nos permite reemplazar textos mediante expresiones regulares. Los argumentos pueden ser arrays, con lo que se realiza más de una sustitución con una sola función.
  • preg_split(). Separa la cadena dada mediante una expresión regular.
  • preg_grep(). Busca el patrón dentro de un array, y devuelve otro array con las ocurrencias.

Ejemplos prácticos:

NOTA: por problemas a la hora de mostrar las barras de escape: \, he tenido que poner el codigo html de la barra que es este (sin espacios): & # 9 2 ; De manera que cuando se usen estas expresiones regulares remplazar el codigo & # 9 2 ; por la barra de escape: \

Direcciones de Email

1
2
3
4
5
6
    $string = "pepito.perez@domain.co.uk";
    if (preg_match(
    '/^[^0-9][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[@][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[.][a-zA-Z]{2,4}$/',
    $string)) {
        echo "ok";
    }

Direcciones IP

1
2
3
4
  function ip_valida($ip) 
  {
      return preg_match("/^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])" ."(&amp;amp;#92;.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$/", $ip);
  }

Fechas Uno de los formatos de fechas típicos es el MM/DD/YYYY y su validación es la siguiente.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$fecha= "16/02/2011";
$patron= "/[0-9]{2}&amp;amp;#92;/[0-9]{2}&amp;amp;#92;/[0-9]{4}$/";


if (preg_match($patron, $fecha))
{
    echo "fecha ok";
}
else
{
    echo "fecha no válida";
}


$fecha= "16-02-2011";
$patron= "/[0-9]{2}-[0-9]{2}-[0-9]{4}$/";

if (preg_match($patron, $fecha))
{
    echo "fecha ok";
}
else
{
    echo "fecha no válida";
}

Sacar la url de una etiqueta de enlace tipo Pedro Ventura Blog

1
preg_match('/^<a href="(.*)">(.*)<&amp;amp;#92;/a>/','<a href="http://www.pedroventura.com">Pedro Ventura Blog</a>',$resultados);

Esto me devolverá lo siguiente:

1
2
3
4
5
6
7
8
9
10
Array
(
    [0] => Array
        (
            [0] => <a href="http://www.pedroventura.com">Pedro Ventura Blog</a>
            [1] => http://www.pedroventura.com
            [2] => Pedro Ventura
        )

)

El primer resultado $resultados[0] contendrá el texto que coincide con el patrón completo. $resultados[1] contendrá el texto que se ha encontrado de la primera captura indicado en el patrón, con la expresión regular, y así sucesivamente.

Expresión regular para reemplazar todo lo que haya en el atributo style de una imagen, el style inclusive. En este caso lo reemplaza por un espacio.

1
$imagen_sin_style = preg_replace('@(<img[^>]*)style=(["|&amp;amp;#92;']).+?&amp;amp;#92;&amp;amp;#92;2@si', '&amp;amp;#92;&amp;amp;#92;1', $imagen);
Esta entrada está licenciada bajo CC BY 4.0 por el autor.