miércoles, 8 de agosto de 2012

Expresiones regulares en Javascript

El problema recurrente

Siempre que hacemos un formulario para solicitar datos de entrada necesitamos validar las entradas. Una de las formas más básicas para validar es mediante expresiones regulares. Este deberia ser una de las primeras etapas de validación. 

Nunca tengo a mano un listado con las expresiones más comunes, asi que aca anoto 3 que son bastantes comunes. Están expresados para utilizar en javascript, pero son facilmente adaptables.

Fecha
^[0-9]{1,2}/[0-9]{1,2}/[0-9]{4}$
Mail
^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$
CUIT Argentina
El mejor para lo último. Agrego también la función para validar el dígito verificador.
^[0-9]{2}-[0-9]{8}-[0-9]$
function validarCUIT(cuit){
        cuit = cuit.toString().replace(/[-_]/g, "");

        var codigo_valido = true;
        if(cuit.length != 11)
            codigo_valido = false;
        else {
            /* Funcion de CUIT encontrada en internet */
            var mult = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2];
            var total = 0;
            for(var i = 0; i < mult.length; i++) {
                total += parseInt(cuit[i]) * mult[i];
            }
            var mod = total % 11;
            var digito = mod == 0 ? 0 : mod == 1 ? 9 : 11 - mod;
            codigo_valido = digito != parseInt(cuit[10]);
        }
        return codigo_valido;
}
A medida que vaya utilizando nuevas, las voy a ir agregando. Saludos!

5 comentarios:

  1. Seguro que funciona??

    a mi no me funciona :(

    ResponderEliminar
  2. alguien por favor me puede explicar esta parte??

    var digito = mod == 0 ? 0 : mod == 1 ? 9 : 11 - mod;

    gracias!!


    ResponderEliminar
    Respuestas
    1. var digito = mod == 0 ? 0 : mod == 1 ? 9 : 11 - mod;

      Con esa sentencia en una sola linea reemplaza varias lineas de codigo if y else.
      Lo que dice alli es. Si mod es igual a cero, entonces (?) digito vale 0. Si (:) mod es igual a 1 entonces (?) digito vale 9. Sino en ultima instancia no ocurre los casos anteriores, se resta 11 menos el modulo, y ese sera el digito verificador.
      Saludos y exitos, hace una semana que estoy con toda esta mierda y ya no se ni como sentarme jajaja
      Marcos.

      Eliminar
  3. Muchas Gracias! Muy bueno!
    Comentario: existen dominios de mas de 3 caracteres (ej.: .info)
    se podria dejar de 2 a 4..

    ^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$

    ResponderEliminar
  4. la función para validar el cuit tiene un error en la última condicional
    "codigo_valido = digito != parseInt(cuit[10]);"
    donde la misma debería ser == no negado (!=)

    Les dejo la función refactorizada y funcionando:

    function validateCUIT (cuit) {
    let providerCUIT = cuit.toString().replace(/[-_]/g, '')

    console.log('cuit:', providerCUIT)
    console.log('largo:', providerCUIT.length)

    let valid = true
    let total = 0
    let modulo = 0
    let digit = 0
    let multiplier = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]

    if (providerCUIT.length !== 11) {
    valid = false
    } else {
    for (let number = 0; number < multiplier.length; number++) {
    total += parseInt(providerCUIT[number]) * multiplier[number]
    }

    modulo = total % 11
    digit = modulo === 0 ? 0 : modulo === 1 ? 9 : 11 - modulo
    valid = digit === parseInt(providerCUIT[10])
    }

    return valid
    }

    ResponderEliminar

Los comentarios son bienvenidos!!!