Ver Mensaje Individual
  #1 (permalink)  
Antiguo 31/12/2009, 04:09
Avatar de estibaliz2006
estibaliz2006
 
Fecha de Ingreso: noviembre-2006
Mensajes: 439
Antigüedad: 17 años, 5 meses
Puntos: 1
algo curioso con las expresiones regulares

Hola a todos/as: me pasa algo curiosillo con la validación de un formulario a través de las expresiones regulares. para simplificar diré que el formulario solo tiene dos campos, nombre y cif/nif:

código del formulario:

Código PHP:
//si pulsamos el botón enviar del formulario
if(isset($_POST['submit'])) 
{
  
   
// Creamos nombres de variables cortos 
   
$nombre trim$_POST['nombre'] );
   
$cifrest trim$_POST['cifrest '] );

 
// validamos que se hayan enviado los campos  
   
if((!empty($nombre ) ) {

 
//si todos los campos están bien cumplimentados hacemos el ingreso enla base de datos

mysql_query("INSERT INTO alumnos(nombre, cifrest ) VALUES ('$nombre','$cifrest ')");
}
else 
   {
echo 
"<br><div style=\"background-color: #FFFFFF; border: #FFA500 1px solid; padding: 6px;\"><span class=\"text1\">Se han detectado los siguientes errores. Por favor, corríjalos y reenvíe la información</span><br><br>"
      if(empty(
$nombre)) {
         echo 
"<span class=\"text14\">El campo Nombre es obligatorio</span></br>"
         
$nombre$nombre."\" style=\"background-color: #FFE4E1\"";  
         }

//APARTADO ESPECIAL VALIDACION CIF
    //preparación de los datos
    
$cifrest strtoupper($cifrest);
        for (
$i 0$i 9$i ++)
            
$num[$i] = substr($cifrest$i1);     
         
    
//si está vacío el campo devuelve error 
      
if(empty($cifrest)) {
         echo 
"<span class=\"text14\">El campo CIF/NIF es obligatorio</span></br>"
         
$cifrest $cifrest."\" style=\"background-color: #FFE4E1\"";  
         }
    
//si no tiene un formato valido devuelve error
        
elseif (!empty($cifrest) && !ereg('((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)'$cifrest)) {
         echo 
"<span class=\"text14\">Introduzca un NIF válido</span></br>"
         
$cifrest $cifrest."\" style=\"background-color: #FFE4E1\"";  
      }    
    
//comprobacion de NIFs estandar
        
if (ereg('(^[0-9]{8}[A-Z]{1}$)'$cifrest))    {
            if (
$num[8] == substr('TRWAGMYFPDXBNJZSQVHLCKE'substr($cifrest08) % 231)) {}
            else {
         echo 
"<span class=\"text14\">Introduzca un NIF válido</span></br>"
         
$cifrest $cifrest."\" style=\"background-color: #FFE4E1\""; } 
            }  
    
//algoritmo para comprobacion de codigos tipo CIF
        
$suma $num[2] + $num[4] + $num[6];
        for (
$i 1$i 8$i += 2)
            
$suma += substr(($num[$i]),0,1) + substr(($num[$i]),1,1);
        
$n 10 substr($sumastrlen($suma) - 11);
    
//comprobacion de NIFs especiales (se calculan como CIFs)
        
if (ereg('^[KLM]{1}'$cifrest)) {
            if (
$num[8] == chr(64 $n)) {}
            else {
         echo 
"<span class=\"text14\">Introduzca un NIF válido</span></br>"
         
$cifrest $cifrest."\" style=\"background-color: #FFE4E1\""; } 
            }
    
//comprobacion de CIFs
        
if (ereg('^[ABCDEFGHJNPQRSUVW]{1}'$cifrest)) {
            if (
$num[8] == chr(64 $n) || $num[8] == substr($nstrlen($n) - 11)) {}
            else
           {
         echo 
"<span class=\"text14\">Introduzca un CIF válido</span></br>"
         
$cifrest $cifrest."\" style=\"background-color: #FFE4E1\""; } 
            }  
    
//comprobacion de NIEs
        //T
        
if (ereg('^[T]{1}'$cifrest)) {
            if (
$num[8] == ereg('^[T]{1}[A-Z0-9]{8}$'$cifrest)) {}
             else
           {
         echo 
"<span class=\"text14\">Introduzca un NIE válido</span></br>"
         
$cifrest $cifrest."\" style=\"background-color: #FFE4E1\""; } 
            }    
        
//XYZ
        
if (ereg('^[XYZ]{1}'$cifrest)) {
            if (
$num[8] == substr('TRWAGMYFPDXBNJZSQVHLCKE'substr(str_replace(array('X','Y','Z'), array('0','1','2'), $cifrest), 08) % 231)) {}
             else
           {
         echo 
"<span class=\"text14\">Introduzca un NIE válido</span></br>"
         
$cifrest $cifrest."\" style=\"background-color: #FFE4E1\""; } 
            }    
    
//FINAL APARTADO ESPECIAL VALIDACION CIF

}
//y este es el formulario
echo "<form action=\"".$_SERVER['PHP_SELF']."\" method=\"POST\">"
echo 
"Nombre<br><input type=\"text\" name=\"nombre\" class=\"caja\" size=\"50\" value=\"$nombre\"></br>"
echo 
"CIF/NIF<br><input type=\"text\" name=\"cifrest\" class=\"caja\" size=\"50\" value=\"$cifrest\"></br>"
echo 
"<br><input type=\"submit\" name=\"submit\" class=\"caja\" value=\"Enviar\">"
Bien. lo que pasa es que si el campo nombre está vacío, me hace todas las validaciones, tanto el del nombre diciendo que ese campo no puede estar vacío como la del CIF/NIF si yo meto algún cif o algún nif erróneo (porque me equivoque de letra o menos dígitos o lo que sea). pero si yo cumplimento los dos campos, en el campo cif/nif puedo meter el cif o el nif que quiera (incluso con letras erróneas) que se lo traga y lo registra en la base de datos.

a qué es debido?

gracias por vuestra ayuda y feliz año
__________________
desgraciadamente no conozco php ni la mitad de lo que lo conocen ustedes y eso es menos de la mitad de lo que yo querria y lo que yo querria es menos de la mitad de lo que la mitad de ustedes conocen