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,xml expresiones regulares reemplazar texto,php expresion regular caracter /,php expresion regular ( *),php expresión regular,php capturar expresiones regulares,patrones preg_match,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 para extraer enlace de html,php expresion regular solo texto,validar expresiones regulares para correo de tipo nombre nombre@dominio com php,preg_match_all con numeros 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 *

Invertir en criptomonedas: »

 

Cómo comprar bitcoin

Invertir y comprar Bitcoin y otras altcoins es más fácil de lo que crees.

1) Si sólo quieres comprar Bitcoin, Ethereum o Litecoin como inversión, tu opción es Coinbase

2) Si quieres probar con otras criptomonedas tu opción es Binance

3) Cualquier duda escríbeme con total libertad al formulario de contacto para resolver dudas: https://www.pedroventura.com/contacto/

¡Comparte este artículo! »

  • carlos hernandez (3 días)
    Hola, hay alguna funcion k sirva para saber el correo…
  • steven (2 semanas)
    tengo un problema me sale este error cuando pongo data:…
  • lewis rod (3 semanas)
    https://t.me/joinchat/Hs_yUFG_xDVJ-PS3cWEYAw este es el enlace me equivoque.
  • lewis rod (3 semanas)
    https://t.me/joinchat/Hs_yUBDhw2Uk7D3D835GJQ grupo de telegram latino sudamericano peru, colombia, ecuador, chile,…
  • Harol (4 semanas)
    Todo el mundo da gracias porque no lo ha hecho,…
  • Renzo (4 semanas)
    Excelente.. Simple y efectivo. Gracias

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