Menú Principal

Duda con EREG

Iniciado por mokoMonster, 27 Noviembre 2010, 23:05 PM

0 Miembros y 2 Visitantes están viendo este tema.

mokoMonster

Hola a todos:

Mi problema es que tengo este muy sencillo código para comprobar que los campos solo puedan tener puntos y algunos signos que encontré navegando.

elseif (ereg("^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]{2,200}\.[a-zA-Z]{2,6}$"$celectronico)) { header("Location: ../registro.php?error=s"); } 

Lo que pasa es que por ejemplo en el campo $celectronico referente a el mail no me deja insertar a la tabla si pongo ejemplo@ejemplo2.com, es decir, si pongo en el campo cualquiera de los siguientes valores si me deja:

hola@.com < Si
holahola@. < Si
@hola.com < Si
high.trip@hotmail.com.mx < Si lo acepta
high.trip@hotmail.com < No lo acepta

Si vuelvo a tratar por ejemplo con: hihehe@hahaha.com otra vez no me lo acepta, alguien me podría orientar por favor?
Es la primera vez que trabajo con Ereg.

Saludos y muchas gracias
"Se necesitaron unos instantes para cortarle la cabeza, pero se necesitara un siglo para producir otra igual."
Lagrange

~ Yoya ~

El sistema de expresiones regulares POSIX en PHP esta obsoleto desde la versión 5.3.0, PHP usa el sistema de expresiones regulares PCRE(Expresiones regulares compatibles con Perl)...
Expresiones Regulares - Basico - Wikielhacker

La expresion que usas esta muy mal formada y debería filtrar mas los datos...

Código (php) [Seleccionar]
<?php

$a 
= array('hola@.com''holahola@.''@hola.com''high.trip@hotmail.com.mx''high.trip@hotmail.com');

foreach(
$a as $aa):

if(
preg_match("/^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]{2,200}\.[a-zA-Z]{2,6}$/"$aa)):
echo 
$aa.'<br>';

endif;

continue;

endforeach;

?>


Salida:

high.trip@hotmail.com

Es el unico dato que valida tu regexp, puedes usar el patron de Raul para validar un mail...

Código (php) [Seleccionar]
<?php

$a 
= array('hola@.com''holahola@.''@hola.com''high.trip@hotmail.com.mx''high.trip@hotmail.com');

foreach(
$a as $aa):

if(
preg_match("/^(?![.,])(?:[\w!#$%&\'*+\/=?^_`{|}~\-]+(?:[.,][\w!#$%&\'*+\/=?^_`{|}~\-]+)*|(?>
\".+\"))+(?![.,])@(?>\[(?:(?>2(?>5[0-5]|[0-4]?\d)|1?\d{1,2})\.){3}(?:(?>2(?>5[0-5]|[0-4]?\d)|1?\d{1,2}))\]|(?![.,])[\w!#$%&\'*+\/=?^_`{|}~\-]+(?:[.,][\w!#$%&\'*+\/=?^_`{|}~\-]+)*(?:\.[a-zA-Z]+))$/", $aa)):
echo $aa.'<br>';

endif;

continue;

endforeach;

?>


Salida:

high.trip@hotmail.com.mx
high.trip@hotmail.com


Saludos
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.

mokoMonster

Esto parece que funcionará, muchisimas gracias.
Quisiera preguntarte algo, foreach hace como un bucle para cada valor en el array cierto? es decir $aa pasa como si tuviera un valor 5 veces cierto?

Solo quiero entender bien el funcionamiento del foreach para implementarlo :)

Muchisimas gracias y Saludos
"Se necesitaron unos instantes para cortarle la cabeza, pero se necesitara un siglo para producir otra igual."
Lagrange

~ Yoya ~

Um... El array a contiene 5 valores... Uso foreach para recorrer todos sus valores... Con un simple ejemplo entenderás su funcionamiento...

Código (php) [Seleccionar]
<?php

$array 
= array('Hola''Adios''Elhacker''Wikipedia''Google');

foreach(
$array as $valor):

echo 
$valor'<br>';

endforeach;

?>


Salida:

Hola
Adios
Elhacker
Wikipedia
Google


Osea, recorro el array hasta que no existan mas valores... Cuando recorres un array, cada posición del array sera un ciclo, porque primero recorre la primera posicion y si existe otra vuelve y recorre la siguiente...

Código (php) [Seleccionar]
<?php

$array 
= array('Hola''Adios''Elhacker''Wikipedia''Google');

foreach(
$array as $valor):
$i += 1;

echo 
'Ciclo nº '$i.'<br>';
echo 
$valor'<br><br>';


endforeach;

?>


Salida:

Ciclo nº 1
Hola

Ciclo nº 2
Adios

Ciclo nº 3
Elhacker

Ciclo nº 4
Wikipedia

Ciclo nº 5
Google


Bueno el code anterior funciona asi:
En cada ciclo uso la sentencia if en conjunto con una expresión regular para comprobar que los sean veldadero, si los datos son correctos se ejecuta lo que esta dentro de la sentencia if y si no son correctos no se ejecuta el if... Uso continue para forzar al bucle foreach a pasar al siguiente siclo... Hacer una pruebas y entenderás mejor
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.

xassiz~

#4
@Yoya: interesante, nunca había visto esa sintaxis en PHP :o Mis códigos están llenos de llaves ;D

mokoMonster

Wow! Ahora tratando de entenderlo un poco quise hacerle un arreglo al código para ver si la capte bien, pero al parecer creo que no, te pongo todo el código de lo que intento hacer a ver si tienes tiempo de ayudarme, en realidad se que mi código es muy simple pero funciona (excepto por el foreach o preg_match) para lo que necesito.

include("fix.php");
$link=Conectarse();

//Variables de Formulario Registro
$nombre=$_POST['nombre'];
$usuario=$_POST['usuario'];
$password=sha1($_POST['password']);
$rpassword=sha1($_POST['rpassword']);
$celectronico=$_POST['celectronico'];
$sexo=$_POST['sexo'];
$anos=$_POST['anos'];
$pais=$_POST['pais'];
$contrato=$_POST['contrato'];
$ip=$_POST['ip'];
$explorador=$_POST['explorador'];
$fecha=$_POST['fecha'];

//Consultas
$queryUser=mysql_query("SELECT usuario FROM Usuarios WHERE usuario='$usuario'",$link)or die(mysql_error());
$queryMail=mysql_query("SELECT celectronico FROM Usuarios WHERE celectronico='$celectronico'",$link)or die(mysql_error());
$qur mysql_num_rows($queryUser);
$qmr mysql_num_rows($queryMail);

$a = array($nombre,$usuario,$password,$rpassword,$celectronico);
 
foreach(
$a as $aa):
 
if(
preg_match("/^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]{2,200}\.[a-zA-Z]{2,6}$/"$aa))
{
continue; 
	
//Comprobaciones
	
if (empty(
$nombre)){ header("Location: ../registro.php?error=n"); }
	
elseif (empty(
$usuario)) { header("Location: ../registro.php?error=u"); }
	
elseif (
$qur 0) { header("Location: ../registro.php?error=ue"); } 
	
elseif (empty(
$password)) { header("Location: ../registro.php?error=p"); }
	
elseif (empty(
$rpassword)) { header("Location: ../registro.php?error=rp"); }
	
elseif (
$password!=$rpassword) { header("Location: ../registro.php?error=prp"); }
	
elseif (empty(
$celectronico)) { header("Location: ../registro.php?error=ce"); }
	
elseif (
$qmr 0) { header("Location: ../registro.php?error=cee"); } 
	
elseif (empty(
$contrato)) { header("Location: ../registro.php?error=c"); }
	

	
else { 
	
	
mysql_query("insert into Usuarios (nombre,usuario,password,celectronico,sexo,anos,pais,contrato,ip,explorador,fecha) values ('$nombre','$usuario','$password','$celectronico','$sexo','$anos','$pais','$contrato','$ip','$explorador','$fecha')",$link) or die(mysql_error());
	
	
mysql_free_result($queryUser);
	
	
mysql_free_result($queryMail);
	
	
mysql_close($link);
	
	
echo 
'Conexion Finalizada ;)<br>Datos introducidos correctamente a la tabla.';
	
	
}
	

//
}
else { 
header("Location: ../registro.php?error=s"); }
endforeach;

?>


Saludos :)
"Se necesitaron unos instantes para cortarle la cabeza, pero se necesitara un siglo para producir otra igual."
Lagrange

xassiz~

Yo creo que te lías un poco, podrías hacer una funcion validar() y acabas antes. Y tu código es vulnerable a Inyecciones SQL, esas variables del "Formulario Registro" pasalas por mysql_real_escape_string().
Código (php) [Seleccionar]

$nombre = mysql_real_escape_string($_POST['nombre']);
$usuario = mysql_real_escape_string($_POST['usuario']);
...

mokoMonster

Cita de: pablomi en 28 Noviembre 2010, 01:09 AM
Yo creo que te lías un poco, podrías hacer una funcion validar() y acabas antes. Y tu código es vulnerable a Inyecciones SQL, esas variables del "Formulario Registro" pasalas por mysql_real_escape_string().
Código (php) [Seleccionar]

$nombre = mysql_real_escape_string($_POST['nombre']);
$usuario = mysql_real_escape_string($_POST['usuario']);
...


Muchas Gracias así lo haré :) pero es que justamente ese es el problema que tengo, que aun no se como hacerlos validar :(
Agradecería tu ayuda :)

Saludos
"Se necesitaron unos instantes para cortarle la cabeza, pero se necesitara un siglo para producir otra igual."
Lagrange

~ Yoya ~

cuando programes siempre trata de saber todo lo que haces, porque estarás en un error sin saberlo...

Código (php) [Seleccionar]
if(preg_match("/^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]{2,200}\.[a-zA-Z]{2,6}$/", $aa))
{
continue;
//Comprobaciones
if (empty($nombre)){ header("Location: ../registro.php?error=n"); }
elseif (empty($usuario)) { header("Location: ../registro.php?error=u"); }
elseif ($qur > 0) { header("Location: ../registro.php?error=ue"); }
elseif (empty($password)) { header("Location: ../registro.php?error=p"); }
elseif (empty($rpassword)) { header("Location: ../registro.php?error=rp"); }
elseif ($password!=$rpassword) { header("Location: ../registro.php?error=prp"); }
elseif (empty($celectronico)) { header("Location: ../registro.php?error=ce"); }
elseif ($qmr > 0) { header("Location: ../registro.php?error=cee"); }
elseif (empty($contrato)) { header("Location: ../registro.php?error=c"); }

else {
mysql_query("insert into Usuarios (nombre,usuario,password,celectronico,sexo,anos,pais,contrato,ip,explorador,fecha) values ('$nombre','$usuario','$password','$celectronico','$sexo','$anos','$pais','$contrato','$ip','$explorador','$fecha')",$link) or die(mysql_error());
mysql_free_result($queryUser);
mysql_free_result($queryMail);
mysql_close($link);
echo 'Conexion Finalizada ;)<br>Datos introducidos correctamente a la tabla.';
}

//
}
else { header("Location: ../registro.php?error=s"); }
endforeach;


Nunca de lo que esta después de continue se ejecutara, ya que continue forza a pasar al siguiente ciclo...

Y no puedes usar esa expresion regular para validar todo tipo de datos, esa patron sirve para validar un mail, no un nombre de usuario, password, etc...

Debes entender como funcionan bien los arrays y el loop foreach(). Te recomiendo que las funciones, loop que haz empleado conozca bien como funciona porque si programas sin entender bien lo que haces, casi siempre lo que hagas no funcionara correctamente aunque no produzca un error, estas produciendo un error lógico...

Te recomiendo que antes de darle los valores a las variables nombres, password, etc... Compruebes que los datos que recibes vía POST contengan algún contenido.

Código (php) [Seleccionar]
if(empty($_POST['nombre']) && empty($_POST['pass'])){ exit;//Finalizo
}

$nombre = $_POST['nombre'];
$pass = $_POST['pass'];


Te recomiendo que leas un poco mas.
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.