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

<?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

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

<?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:

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

    $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

  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])" ."(\.([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.


$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";
}


$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

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

Esto me devolverá lo siguiente:

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.

$imagen_sin_style = preg_replace('@(<img[^>]*)style=(["|\']).+?\\2@si', '\\1', $imagen);

Tags de búsquedas:

expresiones regulares php,expresiones regulares php ejemplos,expresiones regulares en php,php expresion regular ( *),php expresión regular,php capturar expresiones regulares,patrones preg_match,xml expresiones regulares reemplazar texto,leer texto con expresiones regulares en php,funcion que retorne fecha de un texto con preg_match,extraer palabras mayusculas php expresion regular,php expresion regular caracter /,php expresion regular para extraer enlace de html,php expresion regular solo texto,validar expresiones regulares para correo de tipo nombre nombre@dominio com php

Noticias relacionadas »

8 comentarios en expresiones regulares php

  1. Pingback: Expresiones regulares y uso del enrutador routes.php de CakePHP

  2. Alexander
    / Responder

    Hola, quisera una ayuda en esto… Quiero capturar el codigo de video de youtube, sea cualquiera de estos casos:

    https://www.youtube.com/watch?v=t-onMU8Xr-Q

    https://www.youtube.com/watch?v=6BTjG-dhf5s&list=UU5cqeAzY9MJBiSuAtOlv6LQ&index=1

    https://www.youtube.com/watch?v=LwaFtJHdrkM

    Donde el codigo de todo lo que esta en v=….. y como hay algunos estan separados por guiones o al terminar el codigo sigue &list…..

    Lo que necesito es solo capturar el codigo, gracias de antemano espero me puedan ayudar.

  3. alejandro gallego
    / Responder

    Hola estoy tratando de buscar una cadena de texto en una pagina web pero no he podido realizar una expresion regular correcta para encotrarla. en el preg_mach le digo que me busque humedad y si lo encuentra pero necesito que me extraiga lo que tiene adelante del texto.

    Gracias por la ayuda.

    • alejandro gallego
      / Responder

      crero que no pego el codigo. este es el codigo de la busqueda.gracias.!!

  4. luminemotus
    / Responder
    • Pedro Ventura
      / Responder

      Lo probaré. Si es como tu dices muchas gracias por el comentario!!

  5. / Responder

    En esa expresión regular de fecha que tienes, ¿por qué no pruebas a validar el 29-29-2001? Dice que es una fecha válida

    • Pedro Ventura
      / Responder

      Échale uno ojo ahora! es que había algunos errores en la expresión regular.
      La he dejado así:

      $fecha= "16/02/2011";
      $patron="/^(d){2}/(d){2}/(d){4}$/i";
      
      if (preg_match($patron, $fecha)) 
      {
          echo "fecha ok";
      } 
      else 
      {
          echo "fecha no válida";
      }
      

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

  • marcelino (3 días)
    Os dejo un grupo donde opera uno de los trader…
  • Pedro Ventura (2 semanas)
    Hola Pablo, Creo que puedes configurar los códigos de adsense…
  • Pedro Ventura (2 semanas)
    Buenas, El proveedor cierra facturación el día 10 de cada…
  • pedro (4 semanas)
    Hola pero este sitio paga o no paga , ya…
  • Pedro (1 mes)
    Buenos días Margherita El plugin está obsoleto y ya no…
  • Juan Carlos Díaz (1 mes)
    Este grupo de Telegram me ha dado muy buenas señales…

Suscríbete al newsletter »

Proporciona tu correo electrónico a continuación y recibe las últimas noticias! Funciona con Feedburner de Google

Archivo »

Leer entrada anterior
obtener el nombre del dominio con javascript

Pues algo que acabo de hacer y no sabía. Sacar el nombre del dominio de la web en la que...

Cerrar