Ver Mensaje Individual
  #16 (permalink)  
Antiguo 04/01/2010, 08:03
Avatar de cfranco
cfranco
 
Fecha de Ingreso: enero-2008
Ubicación: Barcelona - España
Mensajes: 182
Antigüedad: 16 años, 3 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