miércoles, 11 de febrero de 2015

Las expresiones regulares

VALIDACION DE FORMULARIOS - EXPRESIONES REGULARES


¿Qué son las expresiones regulares?

Las expresiones regulares son modelos que describen las combinaciones de caracteres en el texto. Se podrían definir como una serie de caracteres que forman un patrón, que representan a otro grupo de caracteres mayor, de tal forma que podemos comparar el patrón con otros conjuntos de caracteres para ver las coincidencias. Las expresiones regulares pueden utilizarse en múltiples lenguajes de programación pero en esta entrada vamos a ver un ejemplo de validación de formularios mediante Javascript y haciendo uso de expresiones regulares.

¿Cómo interpretarlas?


Ejemplos:

– Número de teléfono nacional (sin espacios) 

• Ejemplo: 954556817 

• Exp. Reg.: /^\d{9}$/ o también /^[0-9]{9}$/ 

Comienza (^) por una cifra numérica (\d) de la que habrá 9 ocurrencias ({9}) y aquí acabará la cadena ($). 

NOTA: La expresión “\d” equivale a la expresión “[0-9]”, y representa a un carácter de una cifra numérica, es decir, ‘0’ o’1’ o ‘2’ o ‘3’ ... o ‘9’.

– Número de teléfono internacional

• Ejemplo: (+34)954556817 

• Exp. Reg.: /^\(\+\d{2,3}\)\d{9}$/ 

Comienza (^) por un paréntesis (\(), le sigue un carácter + (\+), después una cifra numérica (\d) de la que habrá 2 o 3 ocurrencias ({2,3}), después le sigue un paréntesis de cierre (\)), luego viene una cifra numérica de la que habrá 9 ocurrencias ({9}), y aquí acabará la cadena ($). 

NOTA: Puesto que los caracteres: (, ), +, *, -, \, {, }, |, etc... tienen significados especiales dentro de una expresión regular, para considerarlos como caracteres normales que debe incluir una cadena deben de ir precedidos del carácter de barra invertida \. 

– Fecha con formato DD/MM/AAAA

• Ejemplo: 09/01/2006 

• Exp. Reg.: /^\d{2}\/\d{2}\/\d{4}$/ 

Comienza (^) por una cifra numérica (\d) de la que habrá 2 ocurrencias ({2}), después una barra (\/), seguida de 2 cifras numéricas, otra barra, 4 cifras numéricas, y aquí acabará la cadena ($). 

– Código postal

• Ejemplo: 41012 

• Exp. Reg.: /^\d{5}$/ 

Únicamente contiene 5 cifras numéricas. 

– Email

• Ejemplo: usuario@servidor.com 

• Exp. Reg.: /^(.+\@.+\..+)$/ 

Comienza (^) por caracteres cualesquiera que no sean salto de línea (.) de los que habrá al menos una ocurrencia (+), después el carácter arroba (\@), seguido de al menos un carácter que no podrá ser el salto de línea (.+), después viene el carácter punto (\.), seguido de al menos un carácter donde ninguno podrá ser el salto de línea (.+), y aquí acabará la cadena ($). 



Patron de expresiones regulares





Caracteres especiales





Validación de Formularios

Visualización



Este es un ejemplo de Control de formulario. 
En este caso se han puesto en práctica las siguientes expresiones regulares:


  • var expresion_regular_nombre = /^[A-Za-záéíóúñ]{2,}([\s][A-Za-záéíóúñ]{2,})+$/; //Una palabra o varias palabras (solo letras)
  • var expresion_regular_dni = /^\d{8}[A-Z]$/; //8 cifras numéricas más letra Mayúscula
  • var expresion_regular_telefono = /^\d{9}$/; //9 cifras numéricas
  • var expresion_regular_mail = /^(.+\@.+\..+)$/; //Que contenga una arroba y un punto
  • var expresion_regular_codigo = /^\d{5}$/; //5 Caracteres numéricos
       









CÓDIGO HTML




    <form id="form" onsubmit="return validacion(this)">
   
    <p>¿Quieres contactar con nosotros o suscribirte a nuestra newsletter? </p>
   
    <p>Escríbenos o déjanos tu e-mail y tu nombre!</p>
  <div id="mensajes" style='display:none;' class="mensajes"><img src="errores.png"/> Ouh! Lo siento, has introducido datos incorrectos</div>
  <br></br><br><br>
    
    
    Nombre y apellidos *: <input type="text" id="campo1" placeholder="Nombre Apellidos" required onblur="validacionnom(form)">
    <br><br>
    NIF/CIF: <input type="text" class="cajachula" id="dni" placeholder="12345678A" onblur="validaciondni(form)" onfocus="enfoco()">
    <br><br>
    Teléfono: <input type="text" id="Telefono" placeholder="123456789" onblur="validaciontel(form)" onfocus="enfoco2()">
    <br><br>
    Email *: <input type="email" name="Email" id="useremail" placeholder="nombre@dominio.com" required onblur="validacionmail(form)" onfocus="enfoco3()">
    <br><br>
    Dirección: <input type="text" name="Dirección" id="dir"  placeholder="C/ Calle nº 3 Portal 1 Piso 3º Letra A" onblur="validaciondirec(form)">
    <br><br>
    Codigo Postal: <input type="text" name="Código Postal" id="codigo" placeholder="12345" onblur="validacioncod(form)"  onfocus="enfoco4()">
    <br></br>
   
    
   Consulta: <TEXTAREA COLS=20 ROWS=10 id="cajatext" NAME="texto" onfocus="enfoco5()"> 
   </TEXTAREA> 
   <br><br>
   <p>* Campos obligatorios.</p>
    <br></br>
   <input type="submit" value="Enviar" name="Enviar" />
   
  
</form>
</div>
</div>



CÓDIGO JAVASCRIPT



    <script>
     
     //Devolver el marco original a los inputs al poner el foco en otro
     function enfoco()
     {
          document.getElementById('campo1').style.border= '';
          document.getElementById('mensajes').style.display = 'none';
     }
     
     
     function enfoco2()
     {
              if(form.dni.value!='')//Volvemos a dejar el formulario como estaba en caso de éste encontrarse vacío, si no, se queda validado(marco verde) o incorrecto (marco rojo)
        {   
        document.getElementById('mensajes').style.display = 'none';
        document.form.dni.reset()//Intento reiniciar a cero el campo pero no funca
              }
              else
              {
              document.getElementById('dni').style.border = '';   
              }
     }
     
     
     function enfoco3()
     {
          if(form.Telefono.value!='')//Volvemos a dejar el formulario como estaba en caso de éste encontrarse vacío, si no, se queda validado(marco verde) o incorrecto (marco rojo)
          {
            document.getElementById('mensajes').style.display = 'none';
          }
          else
          {
              document.getElementById('Telefono').style.border= '';    
          }
     }
    
     
         function enfoco4()
     {
           if(form.useremail.value!='')//Volvemos a dejar el formulario como estaba en caso de éste encontrarse vacío, si no, se queda validado(marco verde) o incorrecto (marco rojo)
          {
                 document.getElementById('mensajes').style.display = 'none';
          }
          else
          {
               document.getElementById('useremail').style.border= '';     
          }
     }
     
       
         function enfoco5()
     {
           if(form.codigo.value!='')//Volvemos a dejar el formulario como estaba en caso de éste encontrarse vacío, si no, se queda validado(marco verde) o incorrecto (marco rojo)
          {
                 document.getElementById('mensajes').style.display = 'none';
          }
          else
          {
               document.getElementById('codigo').style.border= '';     
          }
     }
     
     
     
     //Expresion regular para controlar que se introduzcan nombres y apellidos que empiecen por letra mayúscula
               //Funcion para cambiar el color de la caja del formulario a verde si es correcto y a rojo si es incorrecto
    function validacionnom(form) {
      var expresion_regular_nombre = /^[A-Za-záéíóúñ]{0,40}([\s][A-Za-záéíóúñ]{0,40})+$/; //Varias palabras empezando por Mayúsculas
     
      if((expresion_regular_nombre.test(form.campo1.value)==false) && form.campo1.value!='') {
        
        document.getElementById('campo1').style.border= '2px solid red';
        document.getElementById('campo1').focus()
        document.getElementById('mensajes').style.display = 'block';
        return false; //sale de la funcion y NO envía el formulario
      }
      
      
      else
      {
        if(form.campo1.value!='')
        {
        document.getElementById('campo1').style.border= '2px solid #3aba0f';
        document.getElementById('mensajes').style.display = 'none';
        return true;
        }
      }
    }
     
    
    
   //Expresion regular para controlar que el usuario introduzca ocho dígitos y una letra.
     //Esta funcion resalta el color de la caja del formulario a verde si es correcto y a rojo si es incorrecto
    function validaciondni(form)
    {
       var expresion_regular_dni = /^\d{8}[A-Z]$/; //8 cifras numéricas más letra Mayúscula
      
      if((expresion_regular_dni.test(form.dni.value)==false) && form.dni.value!='') {
        
        document.getElementById('dni').style.border= '2px solid red';
        document.getElementById('mensajes').style.display = 'block';
        
        return false; //sale de la funcion y NO envía el formulario
      }
      else
      {
        if(form.dni.value!='')
        {   
        document.getElementById('dni').style.border= '2px solid #3aba0f';
        document.getElementById('mensajes').style.display = 'none';
        return true;
        }
      }
    }
    
    
    
    //Expresion regular para controlar que el usuario introduzca nueve números.
       //Funcion para cambiar el color de la caja del formulario a verde si es correcto y a rojo si es incorrecto
    function validaciontel(form) {
      var expresion_regular_telefono = /^\d{9}$/; //9 cifras numéricas
      
      if((expresion_regular_telefono.test(form.Telefono.value)==false) && form.Telefono.value!='') {
        
        document.getElementById('Telefono').style.border= '2px solid red';
        document.getElementById('mensajes').style.display = 'block';
        return false; //sale de la funcion y NO envía el formulario
      }
      else
      {
        if(form.Telefono.value!='')
        {
          document.getElementById('Telefono').style.border= '2px solid #3aba0f';
          document.getElementById('mensajes').style.display = 'none';
          return true;
        }
      }
    }
    
    
    
    //Expresion regular para controlar que el usuario introduzca una dirección de correo electrónico válida.
          //Funcion para cambiar el color de la caja del formulario a verde si es correcto y a rojo si es incorrecto
    function validacionmail(form) {
      var expresion_regular_mail = /^(.+\@.+\..+)$/; //Que contenga palabra, un arroba, palabra, punto, palabra (todo seguido)
      
      if((expresion_regular_mail.test(form.useremail.value)==false) && form.useremail.value!='') {
        
        document.getElementById('useremail').style.border= '2px solid red';
        document.getElementById('mensajes').style.display = 'block';
        return false; //sale de la funcion y NO envía el formulario
      }
         else
      {
        if(form.useremail.value!='')
        {
      
      document.getElementById('useremail').style.border= '2px solid #3aba0f';
      document.getElementById('mensajes').style.display = 'none';
      return true;
        }
      }
    }
    
    
    
    //Expresion regular para controlar que el usuario introduzca cinco dígitos
              //Funcion para cambiar el color de la caja del formulario a verde si es correcto y a rojo si es incorrecto
    function validacioncod(form) {
      var expresion_regular_codigo = /^\d{5}$/; //5 Caracteres numéricos
      
      if((expresion_regular_codigo.test(form.codigo.value)==false) && form.codigo.value!='') {
        
        document.getElementById('codigo').style.border= '2px solid red';
        document.getElementById('mensajes').style.display = 'block';
        return false; //sale de la funcion y NO envía el formulario
      }
            else
      {
        if(form.codigo.value!='')
        {
      document.getElementById('codigo').style.border= '2px solid #3aba0f';
      document.getElementById('mensajes').style.display = 'none';
      return true;
        }
      }
    }
    
    
    
    
    //FUNCION GLOBAL QUE COMPRUEBA TODOS LOS CAMPOS ANTES DE ENVIAR
    //Función que ejecuta el evento onSubmit que comprueba al menos los campos obligatorios antes de enviar el formulario.
       //Funcion para cambiar el color de la caja del formulario a verde si es correcto y a rojo si es incorrecto
    function validacion(form) {
      var expresion_regular_nombre = /^[A-Za-záéíóúñ]{2,}([\s][A-Za-záéíóúñ]{2,})+$/; //Una palabra o varias palabras (solo letras)
      var expresion_regular_dni = /^\d{8}[A-Z]$/; //8 cifras numéricas más letra Mayúscula
      var expresion_regular_telefono = /^\d{9}$/; //9 cifras numéricas
      var expresion_regular_mail = /^(.+\@.+\..+)$/; //Que contenga una arroba y un punto
      var expresion_regular_codigo = /^\d{5}$/; //5 Caracteres numéricos
      
      if(expresion_regular_nombre.test(form.campo1.value)==false) {
        
        document.getElementById('campo1').style.border= '3px solid red';
        document.getElementById('mensajes').style.display = 'block';
        return false; //sale de la funcion y NO envía el formulario
      }
                          
      else
      {       
        document.getElementById('campo1').style.border= '2px solid #3aba0f';
        document.getElementById('mensajes').style.display = 'none';
      }
       
      
      if((expresion_regular_dni.test(form.dni.value)==false) && form.dni.value!='') {
        
        document.getElementById('dni').style.border= '3px solid red';
        document.getElementById('mensajes').style.display = 'block';
        
        return false; //sale de la funcion y NO envía el formulario
      }
      else
      {
        if(form.dni.value!='')
        {   
        document.getElementById('dni').style.border= '2px solid #3aba0f';
        document.getElementById('mensajes').style.display = 'none';
        return true;
        }
      }
      
      
      
       if((expresion_regular_telefono.test(form.Telefono.value)==false) && form.Telefono.value!='') {
        
        document.getElementById('Telefono').style.border= '3px solid red';
        document.getElementById('mensajes').style.display = 'block';
        return false; //sale de la funcion y NO envía el formulario
      }
      else
      {
        if(form.Telefono.value!='')
        {
          document.getElementById('Telefono').style.border= '2px solid #3aba0f';
          document.getElementById('mensajes').style.display = 'none';
          return true;
        }
      }
      
      
      if((expresion_regular_codigo.test(form.codigo.value)==false) && form.codigo.value!='') {
        
        document.getElementById('codigo').style.border= '3px solid red';
        document.getElementById('mensajes').style.display = 'block';
        return false; //sale de la funcion y NO envía el formulario
      }
            else
      {
        if(form.codigo.value!='')
        {
      document.getElementById('codigo').style.border= '2px solid #3aba0f';
      document.getElementById('mensajes').style.display = 'none';
      return true;
        }
      }
      
      if(expresion_regular_mail.test(form.useremail.value)==false) {
        
        document.getElementById('useremail').style.border= '3px solid red';
         document.getElementById('mensajes').style.display = 'block';
        return false; //sale de la funcion y NO envía el formulario
      }
      else
      {
      document.getElementById('useremail').style.border= '2px solid #3aba0f';
      document.getElementById('codigo').style.border= '2px solid #3aba0f';
       document.getElementById('Telefono').style.border= '2px solid #3aba0f';
       document.getElementById('dni').style.border= '2px solid #3aba0f';
       document.getElementById('dir').style.border= '2px solid #3aba0f';
       document.getElementById('cajatext').style.border= '2px solid #3aba0f';
      alert('¡Gracias por rellenar nuestro formulario correctamente!\n\nAtenderemos tu petición lo más brevemente posible'); 
      return true; // sale de la función y SÍ envía el formulario
      }
      
    }
    
    
    </script>