Foros del Web » Programando para Internet » PHP »

algo curioso con las expresiones regulares

Estas en el tema de algo curioso con las expresiones regulares en el foro de PHP en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 31/12/2009, 04:09
Avatar de 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
  #2 (permalink)  
Antiguo 31/12/2009, 05:11
 
Fecha de Ingreso: diciembre-2009
Mensajes: 72
Antigüedad: 14 años, 3 meses
Puntos: 0
Respuesta: algo curioso con las expresiones regulares

creo que te faltaba cerrar un parentesis abajo....
lo he probado sin poner ningun valor y no pasa

Código PHP:
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(($nombre!= "")) {
        mysql_query("INSERT INTO alumnos(nombre, cifrest ) VALUES ('$nombre','$cifrest ')");
        }
        else{?>
        <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>
                <?php     if(empty($nombre)) {
                                     echo 
"<span class=\"text14\">El campo Nombre es obligatorio</span></br>"
                                     
$nombre$nombre."\" style=\"background-color: #FFE4E1\"";  
                                }

    
$cifrest strtoupper($cifrest);
        for (
$i 0$i 9$i ++)
            
$num[$i] = substr($cifrest$i1);     
          if(empty(
$cifrest)) {
                     echo 
"<span class=\"text14\">El campo CIF/NIF es obligatorio</span></br>"
                     
$cifrest $cifrest."\" style=\"background-color: #FFE4E1\"";  
        }
               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\"";  
          }    
            if (
ereg('(^[0-9]{8}[A-Z]{1}$)'$cifrest))    {
            if (
$num[8] == substr('TRWAGMYFPDXBNJZSQVHLCKE'substr($cifrest08) &#37; 23, 1)) {}
            
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

}}?>

<form action="<?=$_SERVER['PHP_SELF'];?>" method="POST"> 
Nombre <input type="text" name="nombre" class="caja" size="50" value="<?=$nombre;?>">
CIF/NIF <input type="text" name="cifrest" class="caja" size="50" value="<?=$cifrest;?>">
<input type="submit" name="submit" class="caja" value="Enviar">
</form>
  #3 (permalink)  
Antiguo 31/12/2009, 06:17
Avatar de estibaliz2006  
Fecha de Ingreso: noviembre-2006
Mensajes: 439
Antigüedad: 17 años, 5 meses
Puntos: 1
Respuesta: algo curioso con las expresiones regulares

no claro...si el tema es el siguiente:

Posibilidades:

1.- Campo nombre vacío y Campo cif vacío----valida y dice que el campo nombre no puede estar vacío y el campo CIF/NIF no puede estar vacío.

2.- Campo nombre vacío y Campo cif erróneo (porque la letra esté equivocada, o haya menos de 9 dígitos o lo que sea)----valida y dice que el campo nombre no puede estar vacío y que se debe introducir un NIF válido.

3.- Campo nombre completo y Campo CIF vacío----valida y dice que el campo CIF/NIF no puede estar vacío.

4.- Campo nombre completo y Campo CIF completo (aunque sea con un NIF/CIF erróneo por erro en la letra o porque sea inferior a 9 dígitos, lo que sea)--No valida el campo CIF y lo registra.

Alguna idea de por qué sucede? yo no veo que falte un paréntesis y sea ese el motivo
__________________
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
  #4 (permalink)  
Antiguo 31/12/2009, 10:47
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: algo curioso con las expresiones regulares

pues yo no creo que sea la expresión regular... que fácil es echarle la culpa, no?

porque, vamos... he probado individualmente la expresión y funciona...

lo que esta mal es tu maraña de lógica, o al menos eso apunta tu error...
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 31/12/2009, 10:55
Avatar de Vun
Vun
Colaborador
 
Fecha de Ingreso: agosto-2009
Ubicación: Benalmádena, España
Mensajes: 2.265
Antigüedad: 14 años, 8 meses
Puntos: 150
Respuesta: algo curioso con las expresiones regulares

Muchas veces doy este consejo "estupido", aunque util al 100%

Si no sabes bien la linea que provoca el error "logico", que no "sintactico" lo mejor es que imprimas trazas por todas partes:

Antes de un IF: echo "1111";
Despues del mismo IF: echo "2222";

O en vez de imprimir cualquier texto, imprime las propias variables que quieras ir chequeando. Asi poco a poco en vez de venir a pedir ayuda aqui y pegar todo ese codigo, puedes localizarlo mas y se suele encontrar el error rapidamente.

Suerte
  #6 (permalink)  
Antiguo 31/12/2009, 11:00
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: algo curioso con las expresiones regulares

Cita:
Iniciado por Vun Ver Mensaje
Muchas veces doy este consejo "estupido", aunque util al 100%

Si no sabes bien la linea que provoca el error "logico", que no "sintactico" lo mejor es que imprimas trazas por todas partes:

Antes de un IF: echo "1111";
Despues del mismo IF: echo "2222";

O en vez de imprimir cualquier texto, imprime las propias variables que quieras ir chequeando. Asi poco a poco en vez de venir a pedir ayuda aqui y pegar todo ese codigo, puedes localizarlo mas y se suele encontrar el error rapidamente.

Suerte
para nada es estúpido... a eso se le dice "debuggear" osea.. depurar, de cualquier forma el flujo de la aplicación...

y definitivamente se debe fomentar esa practica (porque siguen creyendo que en el foro hay adivinos) si no, ¿cuando van resolver sus propios problemas??
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #7 (permalink)  
Antiguo 31/12/2009, 12:47
 
Fecha de Ingreso: enero-2008
Mensajes: 381
Antigüedad: 16 años, 3 meses
Puntos: 19
Respuesta: algo curioso con las expresiones regulares

Que grande eres pateketrueke
  #8 (permalink)  
Antiguo 31/12/2009, 13:44
Avatar de estibaliz2006  
Fecha de Ingreso: noviembre-2006
Mensajes: 439
Antigüedad: 17 años, 5 meses
Puntos: 1
Respuesta: algo curioso con las expresiones regulares

Cita:
pues yo no creo que sea la expresión regular... que fácil es echarle la culpa, no?

porque, vamos... he probado individualmente la expresión y funciona...

lo que esta mal es tu maraña de lógica, o al menos eso apunta tu error...
vaya pateketrueke con ayudas como la tuya para que queremos las novatas más verdad? vaya tela
__________________
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
  #9 (permalink)  
Antiguo 31/12/2009, 13:56
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: algo curioso con las expresiones regulares

Cita:
Iniciado por estibaliz2006 Ver Mensaje
vaya pateketrueke con ayudas como la tuya para que queremos las novatas más verdad? vaya tela
y que tipo de ayuda esperas??


--
¿algo así?, "prueba esto..."
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\">"
o que tipo de "ayuda"... ¿necesitas??


--
lee bien lo que escribes:
Cita:
no claro...si el tema es el siguiente:

Posibilidades:

1.- Campo nombre vacío y Campo cif vacío----valida y dice que el campo nombre no puede estar vacío y el campo CIF/NIF no puede estar vacío.

2.- Campo nombre vacío y Campo cif erróneo (porque la letra esté equivocada, o haya menos de 9 dígitos o lo que sea)----valida y dice que el campo nombre no puede estar vacío y que se debe introducir un NIF válido.

3.- Campo nombre completo y Campo CIF vacío----valida y dice que el campo CIF/NIF no puede estar vacío.

4.- Campo nombre completo y Campo CIF completo (aunque sea con un NIF/CIF erróneo por erro en la letra o porque sea inferior a 9 dígitos, lo que sea)--No valida el campo CIF y lo registra.

Alguna idea de por qué sucede? yo no veo que falte un paréntesis y sea ese el motivo
como te he dicho, las expresiones no son las del problema... según lo describes es la lógica la que se te complica...

obviamente no tenemos idea de lo que sucede, no somos videntes... por eso te sugieren depurar por tu cuenta....

y lo mejor de todo: el titulo del tema

pues de curioso nada, y de expresiones regulares... menos!!

__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #10 (permalink)  
Antiguo 31/12/2009, 14:40
Avatar de estibaliz2006  
Fecha de Ingreso: noviembre-2006
Mensajes: 439
Antigüedad: 17 años, 5 meses
Puntos: 1
Respuesta: algo curioso con las expresiones regulares

gracias por todo de nuevo pateketrueke. espero que nunca llegue a lucir la arrogancia de la que presumes....feliz año...(a tí tambien pateketrueke)
__________________
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
  #11 (permalink)  
Antiguo 31/12/2009, 15:16
Avatar de cfranco  
Fecha de Ingreso: enero-2008
Ubicación: Barcelona - España
Mensajes: 182
Antigüedad: 16 años, 2 meses
Puntos: 6
Respuesta: algo curioso con las expresiones regulares

Hola estibaliz2006.

Quizá sea una mejor solución utilizar JavaScript y validar tus datos antes de enviarlos guardarlos.
__________________
Salud y Éxitos
PFI Tube
  #12 (permalink)  
Antiguo 31/12/2009, 18:43
 
Fecha de Ingreso: octubre-2006
Mensajes: 78
Antigüedad: 17 años, 6 meses
Puntos: 1
Respuesta: algo curioso con las expresiones regulares

Cita:
Iniciado por cfranco Ver Mensaje
hola estibaliz2006.

Quizá sea una mejor solución utilizar javascript y validar tus datos antes de enviarlos guardarlos.
+1
  #13 (permalink)  
Antiguo 31/12/2009, 20:56
 
Fecha de Ingreso: enero-2008
Mensajes: 381
Antigüedad: 16 años, 3 meses
Puntos: 19
Respuesta: algo curioso con las expresiones regulares

La validacion de javascript no es un sustituto de la validacion en servidor, y si la usas como tal estaras creando grandes abujeros de seguridad.
  #14 (permalink)  
Antiguo 03/01/2010, 12:37
Avatar de estibaliz2006  
Fecha de Ingreso: noviembre-2006
Mensajes: 439
Antigüedad: 17 años, 5 meses
Puntos: 1
Respuesta: algo curioso con las expresiones regulares

bueno...al que le pueda interesar, ya he conseguido que funcione correctamente la validación del nif y la validación del cif. el problema reside ahora en hacer que funcionen a la vez, es decir, con un único campo CIF/NIF. Os agradecería eternamente si alguien pudiera echarme una mano. Por cierto, comentarios para hacerme ver lo poco que sé sobran... para hundirme moralmente no me hace falta nadie. ya estoy yo. lo dicho, si alguien puede ayudarme, os lo agradecería:

código para validar NIF:

Código PHP:
//si se ha pulsado el botón enviar
if(isset($_POST['submit'])) 
{
  
   
// Creamos nombres de variables cortos 
   
$nombretrim$_POST['nombre'] );
   
$cifresttrim$_POST['cifrest'] );  

/////////////////////////////DATOS BASICOS PARA VALIDAR EL CIF/NIF   
//preparación de los datos para comprobar el cif/nif
    
$cifreststrtoupper($cifrest);
        for (
$i 0$i 9$i ++)
            
$num[$i] = substr($cifrest$i1);    
//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);    
/////////////////////////////FINAL DATOS BASICOS PARA VALIDAR EL CIF/NIF 

// validamos que se hayan enviado los campos  
   
if (!empty($nombre
   && !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)     
   && 
ereg('(^[0-9]{8}[A-Z]{1}$)'$cifrest)
   && 
$num[8] == substr('TRWAGMYFPDXBNJZSQVHLCKE'substr($cifrest08) &#37; 23, 1)
   
)

//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/NIF
     
    //VALIDACION NIF     
    //si está vacío el campo devuelve error 
      
if(empty($cifrest)) {
         echo 
"<span class=\"text14\">El campo 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: Comprobamos que tenga 9 digitos
        
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) && !ereg('(^[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: Comprobamos que sea la letra sea la de NIF válido
        
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) && ereg('(^[0-9]{8}[A-Z]{1}$)'$cifrest) && $num[8] != substr('TRWAGMYFPDXBNJZSQVHLCKE'substr($cifrest08) % 231))    {
         echo 
"<span class=\"text14\">Introduzca un NIF válido</span></br>"
         
$cifrest $cifrest."\" style=\"background-color: #FFE4E1\"";  
        }
    
//FINAL APARTADO ESPECIAL VALIDACION NIF
 
                
    
    //FINAL APARTADO ESPECIAL VALIDACION CIF/NIF
      
echo "</div><br><br>";
}
//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 
"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. con el código de arriba se valida correctamente los NIF.

Vamos ahora con el código en el supuesto de que en lugar de ser un NIF fuera un CIF:

código para validar CIF:

Código PHP:
//si se ha pulsado el botón enviar
if(isset($_POST['submit'])) 
{
  
   
// Creamos nombres de variables cortos 
   
$nombretrim$_POST['nombre'] );
   
$cifresttrim$_POST['cifrest'] );  

/////////////////////////////DATOS BASICOS PARA VALIDAR EL CIF/NIF   
//preparación de los datos para comprobar el cif/nif
    
$cifreststrtoupper($cifrest);
        for (
$i 0$i 9$i ++)
            
$num[$i] = substr($cifrest$i1);    
//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);    
/////////////////////////////FINAL DATOS BASICOS PARA VALIDAR EL CIF/NIF 

// validamos que se hayan enviado los campos  
   
if (!empty($nombre
   && !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)     
   && 
ereg('^[ABCDEFGHJNPQRSUVW]{1}'$cifrest)
   && 
$num[8] == chr(64 $n)
   || 
!empty(
$nombre
   && !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)     
   && 
ereg('^[ABCDEFGHJNPQRSUVW]{1}'$cifrest)
   && 
$num[8] == substr($nstrlen($n) - 11)
   )

//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/NIF
     
    //VALIDACION NIF     
    //si está vacío el campo devuelve error 
     
if(empty($cifrest)) {
         echo 
"<span class=\"text14\">El campo CIF 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 CIF válido</span></br>"
         
$cifrest $cifrest."\" style=\"background-color: #FFE4E1\"";  
      }    
  
    
//comprobacion de NIFs estandar: Comprobamos que tenga 9 digitos
        
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) && !ereg('^[ABCDEFGHJNPQRSUVW]{1}'$cifrest))    {
         echo 
"<span class=\"text14\">Introduzca un CIF válido</span></br>"
         
$cifrest $cifrest."\" style=\"background-color: #FFE4E1\"";  
        }
    
//comprobacion de NIFs estandar: Comprobamos que sea la letra sea la de NIF válido
        
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) && ereg('^[ABCDEFGHJNPQRSUVW]{1}'$cifrest) && $num[8] != chr(64 $n) || $num[8] != substr($nstrlen($n) - 11))    {
         echo 
"<span class=\"text14\">Introduzca un CIF válido</span></br>"
         
$cifrest $cifrest."\" style=\"background-color: #FFE4E1\"";  
        }
    
//FINAL APARTADO ESPECIAL VALIDACION NIF
 
                
    
    //FINAL APARTADO ESPECIAL VALIDACION CIF/NIF
      
echo "</div><br><br>";
}
//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<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. podéis comprobar como esos dos formularios validan correctamente el NIF y el CIF. Es decir, si yo en un sólo formulario meto dos campos diferentes, uno CIF y otro NIF y valido con esas expresiones, todo correcto. Pero lo que yo quiero es un único formulario y un único campo para el CIF/NIF de tal modo que si yo meto un NIF lo valide y si yo meto un CIF lo valide. lo tengo conseguido por separado pero no soy capaz de mezclarlo todo para que lo valide a través de un único campo. estoy saturada.

Por favor, se agradecen colaboraciones constructivas....gracias:corazon :
__________________
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

Última edición por estibaliz2006; 03/01/2010 a las 12:45
  #15 (permalink)  
Antiguo 03/01/2010, 12:50
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: algo curioso con las expresiones regulares

disculpa de nuevo, pero sigo sin ver el problema....

realmente todo se reduce a ingenio y creatividad, porque te estas complicando demasiado por algo sencillo....

en resumen, puedes abreviar toda tu lógica empleando funciones que tu mismo puedes escribir, ej.
Código PHP:
include_once 'funciones.php';

if ( ! empty(
$_POST['el_submit']))
{
  
$foo $_POST['foo'];
  
$bar $_POST['bar'];

  if ( ! 
is_foo($foo)) // no es un FOO valido
  
elseif ( ! is_bar($bar)) // no es una BAR valido
  
else // OK... es un BAR/FOO valido

obviamente foo y bar pueden representar a tus variables NIF/CIF

esto es para ver mas claro tu código, porque yo sigo sin entenderlo...

la idea es que "fabriques" algunos validadores, usando funciones por ejemplo... que te asegures que sirven individualmente en su totalidad, y bien...

posteriormente aplicarlos lógicamente


PDTA: como siempre, se que mi respuesta no es lo que esperabas... pero si lo reflexionas, seguro te da alguna pista....
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #16 (permalink)  
Antiguo 04/01/2010, 08:03
Avatar de cfranco  
Fecha de Ingreso: enero-2008
Ubicación: Barcelona - España
Mensajes: 182
Antigüedad: 16 años, 2 meses
Puntos: 6
Respuesta: algo curioso con las expresiones regulares

Hola otra vez.

Estoy de acuerdo que éste foro es un medio de información de ayuda, pero al parecer no se está llegando a ningun lugar.

Es entonces que es mi deber como programador y emprendedor es el de aportar un granito de arena, ya que recuerdo a todos que comenzar es sumamente complicado para unos, pero una vez que se llega a un cierto nivel en base a práctica, el aprendiz ocupará el lugar del maestro y así seguira el ciclo evolutivo, y sin enrrollarme más con esto voy con lo mio:

Aplicando la teoria de pateketrueke lo que te faltaría es crear dos funciones por separado: valida_cif(dato) y valida_nif(dato) respectivamente y que cada funcion devuelva en valor lógico TRUE y FALSE.

Suponiendo que tu código esté bien diseñado, tu función valida_cif(dato) será el siguiente:

Código PHP:
<?php 
 funcion valida_cif
($cifrest)
 {  
//preparación de los datos para comprobar el cif/nif
    
$cifreststrtoupper($cifrest);
        for (
$i 0$i 9$i ++)
            
$num[$i] = substr($cifrest$i1);    
//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);    
/////////////////////////////FINAL DATOS BASICOS PARA VALIDAR EL CIF/NIF 

// validamos que se hayan enviado los campos  
   
if (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)     
   && 
ereg('(^[0-9]{8}[A-Z]{1}$)'$cifrest)
   && 
$num[8] == substr('TRWAGMYFPDXBNJZSQVHLCKE'substr($cifrest08) % 231))

 
//VALIDACION NIF     
    //si está vacío el campo devuelve error 
      
if(empty($cifrest)) {
      return 
false;         
      }
    
//si no tiene un formato valido devuelve error
      
else if (!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)) {
      return 
false;         
      }    
  
    
//comprobacion de NIFs estandar: Comprobamos que tenga 9 digitos
        
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) && !ereg('(^[0-9]{8}[A-Z]{1}$)'$cifrest))    {
      return 
false;         
      }    
    
//comprobacion de NIFs estandar: Comprobamos que sea la letra sea la de NIF válido
        
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) && ereg('(^[0-9]{8}[A-Z]{1}$)'$cifrest) && $num[8] != substr('TRWAGMYFPDXBNJZSQVHLCKE'substr($cifrest08) % 231))    {
      return 
false;         
      }    
      
  return 
true;
 }

function 
valida_nif($cifrest)
{
 ...
}
?>
Un vez que tienes las dos funciones sólo tienes que aplicar la lógica que nos dá pateketrueke, es decir:

Código PHP:

if ( ! empty($_POST['cifrest']))
{
  
$cifrest$_POST['cifrest'];


  if ( 
valida_cif($cifrest) && valida_nif($cifrest)) // si CIF y NIF son vàlidos
  
{...}
  else if (
valida_cif($cifrest) && !valida_nif($cifrest)) // si solo el CIF es vàlido
  
{...}
  else if (!
valida_cif($cifrest) && valida_nif($cifrest)) // si solo el NIF es vàlido
  
{...}
  else 
// si ninguno son validos
  
{...}  

En cada caso se deberia mostrar el mensaje correspondiente.

Y con esto le das mas claridad a tu código segmentandolo en funciones, espero te sirva esto y suerte!!!
__________________
Salud y Éxitos
PFI Tube
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 00:16.