viernes, mayo 29, 2009

Validador de Rut (PHP)

Llevo harto tiempo en esto del desarrollo de software, he hecho cosas bastantes simpáticas y complejas, pero nunca, necesité un validador de RUT.


Me puse manos a la obra y la musa dictó:



function validaRut($rut){
if(strpos($rut,"-")==false){
$RUT[0] = substr($rut, 0, -1);
$RUT[1] = substr($rut, -1);
}else{
$RUT = explode("-", trim($rut));
}
$elRut = str_replace(".", "", trim($RUT[0]));
$factor = 2;
for($i = strlen($elRut)-1; $i >= 0; $i--):
$factor = $factor > 7 ? 2 : $factor;
$suma += $elRut{$i}*$factor++;
endfor;
$resto = $suma % 11;
$dv = 11 - $resto;
if($dv == 11){
$dv=0;
}else if($dv == 10){
$dv="k";
}else{
$dv=$dv;
}
if($dv == trim(strtolower($RUT[1]))){
return true;
}else{
return false;
}
}
?>


Lo pueden probar acá

3 comentarios:

Lester Fibla Saavedra dijo...

Nice. Me gustó la parte que hace que puntos y guión no tengan importancia.

La parte "dura" donde se hacen los cálculos se supone podría ser optimizada, a riesgo de dejar código feo.

Yo uso esta horripilantez :D


function dv($r){$s=1;for($m=0;$r!=0;$r/=10)$s=($s+$r%10*(9-$m++%6))%11;
return chr($s?$s+47:75);}

Jorge dijo...

El punto que te gustó, también puede ser resuelto con expresiones regulares, sería algo así:

preg_replace('[^\-\.]','',$rut);


Posterior a la publicación le hice una reducción en la parte posterior al cálculo quedando así:

function validaRut($rut){
if(strpos($rut,"-")==false){
$RUT[0] = substr($rut, 0, -1);
$RUT[1] = substr($rut, -1);
}else{
$RUT = explode("-", trim($rut));
}
$elRut = str_replace(".", "", trim($RUT[0]));
$factor = 2;
for($i = strlen($elRut)-1; $i >= 0; $i--):
$factor = $factor > 7 ? 2 : $factor;
$suma += $elRut{$i}*$factor++;
endfor;
$dv = 11 - ($suma % 11);
if($dv == 11){
$dv=0;
}else if($dv == 10){
$dv="k";
}
if($dv == trim(strtolower($RUT[1]))){
return true;
}else{
return false;
}
}

Felipe dijo...

GRANDE COMPADRE! Esta bueno tu codigo, me sirvio!..

Felipe.

Publicar un comentario en la entrada