Expresiones regulares en php para filtrar, validar o reemplazar

Hay quien dice que con una expresión regular se puede solucionar casi cualquier problema de programación. Es probable que así sea, pero también es cierto que dominarlas es en ocasiones complicado. En este post vamos a recopilar unas cuantas funciones en php que usan expresiones regulares para validar, filtrar o reemplazar, según se necesite, textos en una cadena.

Validar dirección de email

Con esta función podremos validar si la cadena de texto que hemos recibido siguie el patrón de un email válido.

function validaEmail($email)
{
    $reg = "#^(((( [a-z\d]  [\.\-\+_] ?)*) [a-z0-9] )+)\@(((( [a-z\d]  [\.\-_] ?){0,62}) [a-z\d] )+)\.( [a-z\d] {2,6})$#i";
    return preg_match($reg, $email);
}

La función devuelve 0 (cero o false) si no encuentra coincidencia, así que la podemos usar como boolean en nuestro código de manera similar a ésta :

if(validaEmail("email@dominio.com")) { echo "email valido"; } else { echo "email invalido"; }

Validar fecha

Con la siguiente función podemos validar si una fecha sigue el formato dd/mm/aaaa con los separadores barra "/" o guión "-"

function validaFecha($fecha){
    $sep = " [\/\-] ";
    $req = "#^(((0? [1-9] |1\d|2 [0-8] ){$sep}(0? [1-9] |1 [012] )|(29|30){$sep}(0? [13456789] |1 [012] )|31{$sep}(0? [13578] |1 [02] )){$sep}(19| [2-9] \d)\d{2}|29{$sep}0?2{$sep}((19| [2-9] \d)(0 [48] | [2468]  [048] | [13579]  [26] )|(( [2468]  [048] | [3579]  [26] )00)))$#";
    return preg_match($reg, $fecha);
}

Validar dirección IP

Esta función valida si una dirección IP está dentro del rango entre 0.0.0.0 y 255.255.255.255

function validarIP($ip)
{
    $val_0_to_255 = "(25 [012345] |2 [01234] \d| [01] ?\d\d?)";
    $reg = "#^($val_0_to_255\.$val_0_to_255\.$val_0_to_255\.$val_0_to_255)$#";
    return preg_match($reg, $ip, $matches);
}

Fácilmente adaptable al nuevo protocolo IPv6 añadiendo dos veces más la validación "\.$val_0_to_255" en la segunda línea


Validar codigos postales

Esta función solo permite numeros con formatos xxxxx o xxxxx-xxxx correspondiente al patron de los codigos postales

if (preg_match('/^[0-9]{5,5}([- ]?[0-9]{4,4})?$/', $string)) {
    echo "código postal";
}

Borrar link tags <a> con expresiones regulares

Con la siguiene función php podremos borrar de una cadena de texto los enlaces que contenga en html dejando solo el texto plano que en el anchor del enlace. Por ejemplo si tenemos un texto como :

<p>El mejor <a href="http://www.google.com">buscador</a>  de internet</p>

Usando esta expresión regular podremos eliminar el enlace y dejar la palabra buscador como texto plano :

$texto = preg_replace('/\(.*)\<\/a\>/i','$2',$texto);

Y obtener la misma frase pero sin el enlace
<p>El mejor buscador de internet</p>

Resaltar palabras buscadas

Con ésta útil y a la par sencilla expresión regular podremos resaltar las palabras buscadas en nuestros resultados de búsqueda.

$texto = "Texto de ejemplo con la palabra que estamos buscando";
$texto = preg_replace("/b(palabra)b/i", '<span style="background:#5fc9f6">1</span>', $texto);
echo $texto;

En este caso estamos buscando "palabra" en la variable string y el resultado sería algo parecido a ésto :

Texto de ejemplo con la <span style="background:#5fc9f6">palabra</span> que estamos buscando


Como véis dominar las expresiones regulares puede ser algo extremadamente útil a la hora de tratar la información en nuestro código.

3 comentarios:

  1. es posible validad si un style css esta bien scrito ?
    por ejemplo

    $string = 'position:absolute;top:0;bottom:0;margin-left : -1px;padding:0;'
    if (preg_match('alguna expresion regular', $string)) {
    echo "style css correcto";
    }
    si es posible conoces alguna exprecion regular?
    gracias y saludos

    ResponderEliminar
    Respuestas
    1. Hola, en el ejemplo que yo expongo se validan cosas mas sencillas. Realmente, para validar si el css sintacticamente es correcto no creo que haya problema. Pero, en cambio, para validar cada una de las posibles expressiones en css, su validez, su sintaxis, el rango de valores, etc.. entonces ya si hablamos de algo complejo, que desconozco si es posible validar con una única expresión regular.. imagino que como minimo harian falta varias, cada para validar una parte concreta. Un saludo.

      Eliminar
  2. Le veo una pequeña pega a la validación de IP´S admite ceros de relleno por la izquierda, alguién podría mejorarlo ?
    Saludos.
    Gracias.

    ResponderEliminar