Foros del Web » Programando para Internet » PHP »

validacion y expresiones regulares

Estas en el tema de validacion y expresiones regulares en el foro de PHP en Foros del Web. Hola necesito ver si me pueden ayudar con el siguiente problema me parecia bastante sencillo pero no logro dar con la solucion. lo que necesito ...
  #1 (permalink)  
Antiguo 24/11/2003, 09:12
 
Fecha de Ingreso: septiembre-2003
Mensajes: 26
Antigüedad: 14 años, 2 meses
Puntos: 0
validacion y expresiones regulares

Hola necesito ver si me pueden ayudar con el siguiente problema me parecia bastante sencillo pero no logro dar con la solucion.
lo que necesito es validar un nombre, si asi de sencillo un nombre (con apellido incluido) y cada "nombre" deberia ser minimo de 3 letras y maximo de 15

me explico deberia aceptar cosas como las sgtes.:

juan
juan perez
juan perez perez

No deberia aceptar cosas como las siguientes:

ju (posee solo 2 letras el minimo es 3)
juan pe (el apellido es de solo 2 letras minimo 3)
juan perez pe (idem a lo 2 letras en ves de 3)

creo que la forma mas optima de hacerlo es con expresiones regulares, pero a pesar de que me he leido una gran cantidad de post aqui mismo sobre lo mismo, incluso siguiendo algunos links de manuales que han dado aun no doy con la solucion

esta es la expresion que tengo en estos momentos (una idea basica de como creo que deberia ser), pero me genera distintos errores en la medida que trato de pulirlar

if (!eregi("^[a-z]{3,15} [a-z]{0,15} [a-z]{0-15}+$",$texto))
return false;
else return true;

a ver si me pueden dar una mano.. salu2 y gracias

Pd.- se que una solucion de esto en javascript seria mas facil, pero no me permiten usar javascript :( solo php
  #2 (permalink)  
Antiguo 24/11/2003, 09:18
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 15 años, 5 meses
Puntos: 16
Hola,

Si solo quieres limitar el tamaño de tres palabras separadas por espacios, quizas es mas facil hacer un explode() (www.php.net/explode) para crear un array con esas palabras, y luego recorrer ese array haciendo la comprobacion independiente para cada una ([a-z]{3,15}).

Saludos.

PD: Con esa limitacion, nuestro querido Filemon Pi no pasaria el filtro
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #3 (permalink)  
Antiguo 24/11/2003, 09:54
 
Fecha de Ingreso: septiembre-2003
Mensajes: 26
Antigüedad: 14 años, 2 meses
Puntos: 0
bien lo hice segun sugeriste pero la expresion debe estar mal redactada

temp="$cadena1 $cadena2 $cadena3";
$trozos = explode (" ",$temp);

if (!eregi("[a-z]{3,15}",$trozos[0])) {echo "error en trozo1";} else {echo "correcto trozo1";}
if (!eregi("[a-z]{3,15}",$trozos[2])) {echo "error en trozo2";} else {echo "correcto trozo2";}
if (!eregi("[a-z]{3,15}",$trozos[4])) {echo "error en trozo3";} else {echo "correcto trozo3";}

Warning: REG_BADBR: in ........

si puediran decirme como seria redactada correctamente porke ya me marie entre ^ $ y todo el otro monton de signos que usan las expresiones regulares..:(
  #4 (permalink)  
Antiguo 24/11/2003, 10:02
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 15 años, 5 meses
Puntos: 16
Los elementos del array son el 0, 1, 2. Los espacios no estan en el array.

Y a mi este codigo me funciona perfectamente:
Código PHP:
$cadena1="pep";
$cadena2="e";
$cadena3="3455";
$temp="$cadena1 $cadena2 $cadena3";
$trozos explode (" ",$temp);

if (!
eregi("[a-z]{3,15}",$trozos[0])) {echo "error en trozo1";} else {echo "correcto trozo1";}
if (!
eregi("[a-z]{3,15}",$trozos[1])) {echo "error en trozo2";} else {echo "correcto trozo2";}
if (!
eregi("[a-z]{3,15}",$trozos[2])) {echo "error en trozo3";} else {echo "correcto trozo3";}
echo 
$trozos[0].'<br>';
echo 
$trozos[1].'<br>';
echo 
$trozos[2].'<br>'
Quizas tendrias que poner con que cadenas has hecho la prueba.

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #5 (permalink)  
Antiguo 24/11/2003, 10:16
 
Fecha de Ingreso: septiembre-2003
Mensajes: 26
Antigüedad: 14 años, 2 meses
Puntos: 0
Cita:
Mensaje Original por josemi
[B]Los elementos del array son el 0, 1, 2. Los espacios no estan en el array.
a mi me toma los espacios como elementos del array.. ¿¿??

a ver tratare de ser algo mas especifico
el nombre se recibe en una sola variable (todo junto) por lo que yo debo determinar donde separarlo..tomando en cuenta los espacios en blanco

para aplicarlo a lo que me dijiste recien utilize lo sgte

$cadena1=substr($Texto,0,$espacio1);

con lo cual se me generan las 3 cadenas

y como te digo me keda el array de la sgte forma

[cadena1][espacio][cadena2][espacio][cadena3]

y si coloco por ejemplo JU6N me acepta la entrada
  #6 (permalink)  
Antiguo 24/11/2003, 14:03
 
Fecha de Ingreso: septiembre-2001
Ubicación: Monterrey
Mensajes: 663
Antigüedad: 16 años, 2 meses
Puntos: 6
Haber hasta donde sabemos, tenemos tres grupos de palabras cada uno debe tener una longitud de entre 3 y 15 carateres ademas deben de estar separados por espacios en blanco esto es desde el punto de vista de expresiones regulares compatibles con perl tenemos.
Código:
\w{3,15}\s\w{3,15}\s\w{3,15}
esto para cada grupo. Pero resulta tambien que en nuestro patron podemos emparejar los siguientes casos y nada mas..
Código:
nombre
nombre apellido1
nombre apellido1 apellido2
Bien esto quiere decir que para nuestro primer caso el espacion depues de nombre puede ser opcional, ademas los aplellidos tambien pueden o no estar.asi que nuestra expresion puede quedar algo asi.
Código:
\w{3,15}\s?((\w{3,15})?|(\w{3,15})?)
El signo de interrogacion nos ayuda a decirle al patron que un elemento esta 0 o 1 vez. El "|" nos dice que puede estar uno u otro elemento o ambos. Con esto cotejamos el primer caso y el segundo pero con deficiencias. Si observamos detenidamente podemos ver que cuando se cumple el caso con los dos apellidos, es obligatorio que aparesca un espacio en blanco antecediendo el grupo de caracteres asi que podemos decirle a nuestra expresion que busque al fina de la cadena si algo tiene un espacion antes con lo cual cambia la expresion.
Código:
\w{3,15}\s?((\w{3,15})?|(?<=\s)(\w{3,15}))$
Podemos hacer un ajuste adicional, ya que el patron que coteja cada grupo es el mismo podemos hacer uso de uan referencia atras y hacer un poco mas clara nuestra expresion.
Código:
/(\w{3,15})\s?((\1)?|(?<=\s)(\1))$
a hora si probamos con un ejemplo.
Código PHP:
$pattern "/(\\w{3,15})\\s?((\\1)?|(?<=\\s)(\\1))$/i";

    
$cadena = array(" juan ",
                    
"Juan Perez",
                    
"Juan Perez Salinas",
                    
"Pedro G",
                    
"Ju",
                    
"Carlos Santos Sa",
                    
"J S A");

    foreach( 
$cadena as $v )
    {
        if ( 
preg_match$patterntrim$v ) ) )
        {
            echo 
$v ."</br>\n";
            echo 
"Empareja </br>\n";
        }
        else
        {
            echo 
$v ."</br>\n";
            echo 
"No Empareja </br>\n";
        }
    } 
Espero que haya sido de ayuda
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




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