Expresiones regulares mas usadas en php

Una Expresión regular, también llamada patrón, es una forma de representar a los lenguajes regulares (finitos o infinitos) y se construye utilizando caracteres del alfabeto sobre el cual se define el lenguaje.

Este articulo lo encontre en RoughGuideToPhp.com y tiene una lista con 10 expresiones regulares mas usadas con PHP en nuestros proyectos.

 

1. Validar Nombre de usuario

Esta validación sigue las siguientes reglas:

  • Un nombre de usuario debe empezar con un minúsculas o mayúsculas carta
  • Un usuario sólo puede contener letras, números o pone de relieve
  • Un nombre de usuario debe tener entre 8 y 24 caracteres
  • Un usuario no puede terminar en un guión bajo
function validarUsuario($nombre)
{
	return preg_match("#^[a-z][da-z_]{6,22}[a-zd]$#i", $nombre);
}
//ejm:
if(validarUsuario("nombreUsuario"))
{
	echo "usuario valido";
}
else
{
	echo "usuario invalido";
}

2. Validar Dirección Email

Aquí un ejemplo general para validar un email.

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

//ejm:
if(validarEmail("cesar@gmail.com"))
{
	echo "email valido";
}
else
{
	echo "email invalido";
}

3. Validar Fecha

Esta validación acepta la fecha en formato DD-MM-YYYY, con separadores (/),(-) y (.);

function validarFecha($fecha){
    $sep = "[/-.]";
    $req = "#^(((0?[1-9]|1d|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);
}
//ejm:
if(validarFecha("12/01/2009"))
{
	echo "fecha valida";
}
else
{
	echo "fecha invalida";
}
[/php

<h3 id="validar_ip">4. Validar Direcci&oacute;n IP </h3>
<p>Valida que una dirección IP este dentro del rango 0.0.0.0 a 255.255.255.255</p>
1
function validarIP($ip)
{
    $val_0_to_255 = "(25[012345]|2[01234]d|[01]?dd?)";
    $reg = "#^($val_0_to_255.$val_0_to_255.$val_0_to_255.$val_0_to_255)$#";
    return preg_match($reg, $ip, $matches);
}
//ejm:
if(validarIP("192.168.1.1"))
{
	echo "IP valida";
}
else
{
	echo "IP invalida";
}

5. Validar Numero de Telefono

El formato utilizado seria así: 000 000 0000,(000)-000-0000. Donde los primeros 3 números serian el código de tu País.

function validarTelefono($numero)
{
  $reg = "#^(?d{3})?[s.-]?d{3}[s.-]?d{4}$#";
  return preg_match($reg, $numero);
}
//ejm:
if(validarTelefono("(511)-311-4541"))
{
	echo "telefono valido";
}
else
{
	echo "telefono invalido";
}

6. Validar Numero de tarjeta de credito

Al realizar una aplicación de comercio electrónico es muy importante validar los distintos tipos de tarjetas de credito que hay, esta es una simple función para validarla, solo tiene que llamar a la función getTipoTarjeta(“4111 1111 1111 1111″);

function validarTarjeta($num_tarjeta) 
{
    $num_tarjeta = preg_replace("/D|s/", "", $num_tarjeta);
    $length = strlen($num_tarjeta);
    
    $parity = $length % 2;    
    $sum=0;
    
    for($i=0; $i&lt;$length; $i++) 
    {
      $digit = $num_tarjeta[$i];
      if ($i%2==$parity) $digit=$digit*2;
      if ($digit&gt;9) $digit=$digit-9;
      $sum=$sum+$digit;
    }    
    
    return ($sum%10==0);
}
  
function getTipoTarjeta($cc)
{
    $cards = array(
        "visa" => "(4d{12}(?:d{3})?)",
        "amex" => "(3[47]d{13})",
        "jcb" => "(35[2-8][89]ddd{10})",
        "maestro" => "((?:5020|5038|6304|6579|6761)d{12}(?:dd)?)",
        "solo" => "((?:6334|6767)d{12}(?:dd)?d?)",
        "mastercard" => "(5[1-5]d{14})",
        "switch" => "(?:(?:(?:4903|4905|4911|4936|6333|6759)d{12})|(?:(?:564182|633110)d{10})(dd)?d?)",
    );
    
    $names = array("Visa", "American Express", "JCB", "Maestro", "Solo", "Mastercard", "Switch");
    
    $matches = array();
    
    $pattern = "#^(?:".implode("|", $cards).")$#";
    
    $result = preg_match($pattern, str_replace(" ", "", $cc), $matches);
    
    if($result > 0)
    {
        $result = (validarTarjeta($cc))?1:0;
    }
    
    return ($result>0)?$names[sizeof($matches)-2]:false;
}
//ejm:
echo getTipoTarjeta("4111 1111 1111 1111");

En foros es muy utilizado la función para reemplazar simples direcciones web por enlaces HTML.

function convertirURL($url)
{
    $host = "([a-zd][-a-zd]*[a-zd].)+[a-z][-a-zd]*[a-z]";
    $port = "(:d{1,})?";
    $path = "(/[^?&lt;&gt;#"s]+)?";
    $query = "(?[^&lt;&gt;#"s]+)?";
    
    $reg = "#((ht|f)tps?://{$host}{$port}{$path}{$query})#i";
    return preg_replace($reg, "&lt;a href='$1'&gt;$1&lt;/a&gt;", $url);
}
//ejm:
echo convertirURL(" visita http://www.google.com");

8. Limpiar palabras groseras

Esta expresión regular filtra las palabras groseras que algunos de nuestros usuarios podrían poner.

function deswear($string){
 
    function prep_regexp_array(&$item){
        $item = "#$item#i";
    }
 
    function stars($matches){
        return substr($matches[0], 0, 1).str_repeat("*", strlen($matches[0])-1);
    }    
 
    $swears = array("idiota", "invecil");
    array_walk($swears, "prep_regexp_array");
    return preg_replace_callback($swears, "stars", $string);
}
//ejm:
echo deswear("marcianito es un idiota");

9. Eliminar código Javascript

function limpiarTags($source, $tags = null)
{
    function clean($matched)
    {
          $attribs = 
          "javascript:|onclick|ondblclick|onmousedown|onmouseup|onmouseover|".
          "onmousemove|onmouseout|onkeypress|onkeydown|onkeyup|".
          "onload|class|id|src|style";
          
          $quot = ""|'|`";
          $stripAttrib = "' ($attribs)s*=s*($quot)(.*?)(\2)'i";
          $clean = stripslashes($matched[0]);
          $clean = preg_replace($stripAttrib, '', $clean);
          return $clean;
    }      
 
    $allowedTags='&lt;a&gt;&lt;br&gt;&lt;b&gt;&lt;i&gt;&lt;br&gt;&lt;li&gt;&lt;ol&gt;&lt;p&gt;&lt;strong&gt;&lt;u&gt;&lt;ul&gt;';
    $clean = strip_tags($source, $allowedTags);
    $clean = preg_replace_callback('#&lt;(.*?)&gt;#', "clean", $source);
    return $source;
}
//ejm:
echo limpiarTags("este código es malicioso &lt;script&gt;alert('hola!')&lt;/script&gt;");

10. Remplazar BBCode por HTML

BBCode(Bulletin Board Code) es una manera simple de realizar nuestra propia norma de etiquetas en nuestra web, en vez de etiquetar con código HTML(<strong>) escribiremos [strong] y nuestra función la reemplazara a momento de visualizarla por etiquetas HTML.

function convertirBBcode($string) 
{     
    $string = strip_tags($string);
 
    $patterns = array(
        "bold" =&gt; "#[b](.*?)[/b]#is",
        "italics" =&gt; "#[i](.*?)[/i]#is",
        "underline" =&gt; "#[u](.*?)[/u]#is",
        "link_title" =&gt; "#[url=(.*?)](.*?)[/url]#i",
        "link_basic" =&gt; "#[url](.*?)[/url]#i",
        "color" =&gt; "#[color=(red|green|blue|yellow)](.*?)[/color]#is"
    );
 
    $replacements = array(
        "bold" =&gt; "&lt;b&gt;$1&lt;/b&gt;",
        "italics" =&gt; "&lt;i&gt;$1&lt;/i&gt;",
        "underline" =&gt; "&lt;u&gt;$1&lt;/u&gt;",
        "link_title" =&gt; "&lt;a href="$1"&gt;$2&lt;/a&gt;",
        "link_basic" =&gt; "&lt;a href="$1"&gt;$1&lt;/a&gt;",
        "color" =&gt; "&lt;span style='color:$1;'&gt;$2&lt;/span&gt;"
    );
 
    return preg_replace($patterns, $replacements, $string);
 
}
//ejm:
echo convertirBBcode("[b]letra negrita[/b]");

También te puede interesar

4 Comments

  1. Null
    jun 20, 2009 @ 19:50:25

    Excelente artículo. Lo agrego a mis favoritos :P

  2. Alejandro
    feb 03, 2010 @ 16:13:33

    muy bien los ejemplos y comentarios, me gustaria que escriban sobre funciones JS

    Saludos Cordiales

  3. Fernand
    mar 07, 2011 @ 18:47:29

    El de remplazar una URL por link no funciona :/

  4. XeraX
    ene 05, 2012 @ 03:46:40

    Muchas gracias por el aporte! Muy Útil!