como validar DNI CON PHP, MEDIANTE UNA FUNCION????????

celebryty8
10 de Octubre del 2005
Necesitaria una funcion en php, que me ayude a validar un dni/nif y saber si es correcto o no.
Me podeis ayudar???
Un saludo y gracias por adelentado

Davidbf
10 de Octubre del 2005
Con código PHP directamente o una función javascript si la validación la haces en el cliente.

Saludos

Zelda Predator
10 de Octubre del 2005
Hola,

Aquí te pongo un js que lo hace:

/*
Script para comprobar la validez de
un CIF en España (incluso para sociedades)
*/
function CIFCorrecto(cif)
{
//Comprueba que tenga 9 dígitos, el primero debe ser una letra y el resto números

if (!/^([A-Z]d{8})|([PX]d{7}[A-J])$/.test(cif.toUpperCase()))
{
return false;
}

//Comprueba que la letra sea una de las posibles
if (!/^[ABCDEFGHKLMPQSX]/.test(cif.toUpperCase()))
{
return false;
}

//Comprueba el dígito de control del CIF
return ComprobarDigitoControlCIF(cif);
}

/*
La siguiente función se encarga de validar el dígito de control
*/
function ComprobarDigitoControlCIF(cif)
{
var arrayCIF
var sumaDigitosPares = 0;
var sumaDigitosImpares = 0;
var numero;
var arrayNumero;
var digitoControl;

//mete el cif en un array
arrayCIF = cif.split("");

//Si no tiene 9 caracteres es incorrecto
if (arrayCIF.length != 9)
{
return false;
}

//Suma los dígitos pares de la cadena resultante de quitar el primer y último caracter del CIF
for(i = 2; i < arrayCIF.length - 1; i = i + 2)
{
sumaDigitosPares = sumaDigitosPares + parseInt(arrayCIF[i]);
}

//Multiplicar por 2 los dígitos impares de la cadena resultante de quitar el primer y último caracter del CIF
//y con cada resultado, sumar sus dígitos.
//Sumarlo todo
for(i = 1; i < arrayCIF.length - 1; i = i + 2)
{
numero = arrayCIF[i] * 2;
if (numero > 9)
{
numero = (numero % 10) + 1
}

sumaDigitosImpares = sumaDigitosImpares + numero;
}

//Sumar la suma de dígitos pares y la de dígitos impares
//Coger la última cifra del número obtenido y restarle 10
numero = sumaDigitosPares + sumaDigitosImpares
for (i = numero; i >= 0; i = i - 10)
{
numero = i;
}
digitoControl = 10 - numero;

//Para los tipos de sociedades P y X el dígito de control debe ser una letra
if (arrayCIF[0].toUpperCase() == "P" || arrayCIF[0].toUpperCase() == "X")
{
digitoControl = String.fromCharCode(digitoControl + 64);
}

//Comprueba si el dígito de control se corresponde correctamente
if (digitoControl.toString() == arrayCIF[8])
{
return true;
}
else
{
return false;
}
}

Chimi
10 de Octubre del 2005
Hola Zelda Predator:

He visto tu código y me ha parecido algo bastante interesante. Mientras que en otros foros y consultas se limitan a comprobar que el dígito de control (el último de los nueve) es igual al que se le ha metido como parámetro de entrada y ya está, tú te mojas en decir que si la sociedad es de tipo P o X tiene que ser una letra.

Me puedes decir de donde has sacado esta información? te lo digo pq tengo la intuición que además de la P y X se debe hacer lo mismo en caso de sociedades Q y S.

Si me lo puedes confirmar además con alguna página oficial sería la releche.

Un saludo y gracias de antemano.