PHP - Expresiones Regulares y CIF/NIF

 
Vista:

Expresiones Regulares y CIF/NIF

Publicado por estibaliz2006 (4 intervenciones) el 03/01/2010 12:30:27
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, $i, 1);

//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($cifrest, 0, 8) % 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((2 * $num[$i]),0,1) + substr((2 * $num[$i]),1,1);
$n = 10 - substr($suma, strlen($suma) - 1, 1);
//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($n, strlen($n) - 1, 1)) {}
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), 0, 8) % 23, 1)) {}
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
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Expresiones Regulares y CIF/NIF

Publicado por Diego Romero (1450 intervenciones) el 04/01/2010 01:29:40
Te sugiero un par de cosas, ya que no puedo ejecutar el código tal cual.

Primero que revises bien dónde abres y cierras bloques de código. Segundo, utiliza preg_match() o preg_march_all() en vez de ereg() para evaluar expresiones regulares. Además deberías separar mejor la lógica de negocios de la lógica de presentación, por ejemplo poniendo en funciones las validaciones correspondientes a las cuales le pasas parámetros y te devuelve un resultado "pasó la prueba", "no pasó la prueba".

Esto sería un ejemplo de lo que digo:

$msgerr = Array();
$cifrest = @$POST["cifrest"];
if (empty($cifrest)) {
$msgerr[] = "Cifrest está vacío"; }
else {
if (!CifNifValido($cifrest)) { // función que valida CIF/NIF
$msgerr[] = "Cifrest no es válido.";
}
}

...

if (empty($msgerr)) { // si no hay errores
GuardarEnLaBaseDeDatos($nombre,$cifrest); // guarda en la DB
}
else { // si hay errores mostrarlos.
echo "Hay errores...";
foreach($msgerr as $key => $value) {
echo $value."<br>"; }
}

Como ves en pocas líneas la lógica de la página queda mucho más clara.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar