This topic is locked

How to validate identity document NIF.DNI in spanish?

8/30/2022 9:07:19 AM
PHPRunner General questions
A
alfonso authorDevClub member

I have a field that requests the identification number of a person and I want to validate it. I have a function in php that does it, but I don't know exactly where or how to use it. Any ideas?

function validateNif($nif) {
$nif_codes = 'TRWAGMYFPDXBNJZSQVHLCKE';

$sum = (string) $this->getCifSum ($nif);
$n = 10 - substr($sum, -1);

if (preg_match ('/^[0-9]{8}[A-Z]{1}$/', $nif)) {
// DNIs
$num = substr($nif, 0, 8);

return ($nif[8] == $nif_codes[$num % 23]);
} elseif (preg_match ('/^[XYZ][0-9]{7}[A-Z]{1}$/', $nif)) {
// NIEs normales
$tmp = substr ($nif, 1, 7);
$tmp = strtr(substr ($nif, 0, 1), 'XYZ', '012') . $tmp;

return ($nif[8] == $nif_codes[$tmp % 23]);
} elseif (preg_match ('/^[KLM]{1}/', $nif)) {
// NIFs especiales
return ($nif[8] == chr($n + 64));
} elseif (preg_match ('/^[T]{1}[A-Z0-9]{8}$/', $nif)) {
// NIE extraño
return true;
}

return false;
}
fhumanes 8/30/2022

Hello,

There are many examples of code in PHP in Github that help perform this function.

Watch this: https://github.com/TORR3S/Check-NIF/blob/master/checkNIFv2.php

Cheers,
fernando

A
alfonso authorDevClub member 8/31/2022

Thanks. Gracias. Lo que no sé exactamente es dónde ponerlo

fhumanes 8/31/2022

Hola,

Tienes que ponerlo en "Before Updated" o "Before Added".

Pegas todo el código y después llamas a la función de "checkNIFv2", pasando cómo parámetro el NIF, NIE, lo que hayan introducido.

Si el resultado es "false" es que está mal, en caso contrario te indicará la función de qué tipo es el identificador.

Creo que es bastante sencillo.

Saludos,

A
alfonso authorDevClub member 8/31/2022

Gracias. Lo he intentado, pero da error Parse error: syntax error, unexpected 'function' (T_FUNCTION) :

$nif = $values["nif"]
function checkNIFv2($nif) {
global $dType;
global $dProv;
$nif = pregreplace('/[\W\s]+/','',strtoupper($nif));
if(preg_match('/^(\d|[XYZ])\d{7}[A-Z]$/',$nif)) {
preg_match('/\d+/',$nif,$num);
$num = ($nif[0]!='Z'? $nif[0]!='Y'? 0: 1: 2).$num[0];
if($nif[8]=='TRWAGMYFPDXBNJZSQVHLCKE'[$num%23]) {
return preg_match('/^\d/',$nif)? 'DNI': 'NIE: '.$dType[$nif[0]];
}
}
else if(preg_match('/^[ABCDEFGHJKLMNPQRSUVW]\d{7}[\dA-J]$/',$nif)) {
for($sum=0,$i=1;$i<8;++$i) {
$num = $nif[$i]<<$i%2;
$sum += int($num/10)+$num%10;
}
$c = (10-$sum)%10;
if(((preg_match('/KLMNPQRSW/',$nif) || ($nif[1].$nif[2])=='00') && $nif[8]=='JABCDEFGHI'[$c]) ||
(preg_match('/ABEH/',$nif) && $nif[8]==$c) ||
(preg_match('/CDFGJUV/',$nif) && ($nif[8]=='JABCDEFGHI'[$c] || $nif[8]==$c)) ) {
return (preg_match('/^[KLM]/',$nif)? 'ESP: ':
'CIF: ('.$dProv[substr($nif,1,2)].') ').$dType[$nif[0]];
}
}
return false;
}

fhumanes 9/1/2022

Hola,

El código no está completo. El fichero PHP de GITHUB tiene más código.

Además (perdona esta forma de expresión) creo que tus conceptos de programación de PHP no están consolidados, pues no estás invocando adecuadamente a la función.

¿qué versión de PHPRunner usas para hacerte un ejemplo?

También, nos comunicamos en privado, porque puede que todo esto no sea útil al resto de compañeros. Escríbeme a fernandohumanes@gmail.com

Cuando concluyamos, puedes escribir un resumen de cómo lo has resuelto para el resto de los desarrolladores.

Saludos,
fernando

fhumanes 9/1/2022

Hello,

In this link it is a 10.7 phprunner project that uses this DNI validation library: https://micloud.movistar.es/share/nLXCezHtWfhGQtt1

You have this code in "Before Add" "Before Update":

include "MyCode/checkNIFv2.php";
$nif = $values['dni'];

$validation = checkNIFv2($nif);
if (! $validation){
$message = "Error en el valor introducido para DNI";
return false;
}

return true;

Cheers,
fernando