Autor
|
Tema: Duda con EREG (Leído 5,226 veces)
|
mokoMonster
Desconectado
Mensajes: 301
<? ...
|
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
|
|
« Última modificación: 27 Noviembre 2010, 23:29 pm por mokoMonster »
|
En línea
|
"Se necesitaron unos instantes para cortarle la cabeza, pero se necesitara un siglo para producir otra igual." Lagrange
|
|
|
~ Yoya ~
Wiki
Desconectado
Mensajes: 1.125
|
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 - WikielhackerLa expresion que usas esta muy mal formada y debería filtrar mas los datos... <?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: Es el unico dato que valida tu regexp, puedes usar el patron de Raul para validar un mail... <?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
|
|
|
En línea
|
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
Desconectado
Mensajes: 301
<? ...
|
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
|
|
|
En línea
|
"Se necesitaron unos instantes para cortarle la cabeza, pero se necesitara un siglo para producir otra igual." Lagrange
|
|
|
~ Yoya ~
Wiki
Desconectado
Mensajes: 1.125
|
Um... El array a contiene 5 valores... Uso foreach para recorrer todos sus valores... Con un simple ejemplo entenderás su funcionamiento... <?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... <?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
|
|
|
En línea
|
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~
|
@Yoya: interesante, nunca había visto esa sintaxis en PHP Mis códigos están llenos de llaves
|
|
« Última modificación: 28 Noviembre 2010, 01:06 am por pablomi »
|
En línea
|
|
|
|
mokoMonster
Desconectado
Mensajes: 301
<? ...
|
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
|
|
|
En línea
|
"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(). ...
|
|
|
En línea
|
|
|
|
mokoMonster
Desconectado
Mensajes: 301
<? ...
|
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(). ...
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
|
|
|
En línea
|
"Se necesitaron unos instantes para cortarle la cabeza, pero se necesitara un siglo para producir otra igual." Lagrange
|
|
|
~ Yoya ~
Wiki
Desconectado
Mensajes: 1.125
|
cuando programes siempre trata de saber todo lo que haces, porque estarás en un error sin saberlo... 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()); 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. } $nombre = $_POST['nombre']; $pass = $_POST['pass'];
Te recomiendo que leas un poco mas.
|
|
|
En línea
|
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.
|
|
|
|
|