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ó:
php
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:
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);}
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;
}
}
GRANDE COMPADRE! Esta bueno tu codigo, me sirvio!..
Felipe.
Publicar un comentario en la entrada