Ver Mensaje Individual
  #6 (permalink)  
Antiguo 24/11/2003, 14:03
Herminio Heredia San
 
Fecha de Ingreso: septiembre-2001
Ubicación: Monterrey
Mensajes: 663
Antigüedad: 22 años, 6 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