Ver Mensaje Individual
  #8 (permalink)  
Antiguo 09/08/2005, 17:24
Avatar de derkenuke
derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Sigo, sigo batallando con mi dichoso script, y menos mal que va mejorando (si no ya lo habria dejado).

Tenia un problema estas tres
Cita:
helicoptero >>> he,li,co,co
patata >>> pa,tata
palabra >>> pa,la,la
En realidad el problema diría mas bien que es del lenguaje javascript (atreviéndome a decirlo ) ya que cuando haces un match, no sabes exactamente qué posición tiene lo matcheado dentro de esa palabra.

Lo que he hecho yo aqui:
Código PHP:
    if( p=pal.matchc_c ) ) {
        
q=pal.search(c_c); 
Funciona para la primera incidencia, porque search encuentra la primera incidencia. Pero si tenemos patata, y buscamos [consonante+vocal], todo lo matcheado será:
Cita:
pa,ta,ta
y de ello me interesaba sacar la posicion. Lo hacía con search, teniendo por resultado
Cita:
0,2,2
y no
Cita:
0,2,4
como debería ser.

Asi que he tenido que resolver ésto. Abrí un post para resolverlo, aunque lo resolví fácilmente. Le falta el control por si acaso no hay ningun matching. La funcion me ha quedado asi:
Código PHP:
String.prototype.localizar=function(expReg,modif) {
    
expReg=new RegExp(expReg ,modif);
    
//hacemos el match
    
var matches=this.match(expReg);
    if(
matches!=null) {
        
//este sera el array de almacenamiento de los indices de matches
        
var searches=new Array();
        
//por cada incidencia, añadimos a devolver su posicion
        //vamosPor lleva el control del indice desde el cual empezamos a buscar
        
for(var a=0vamosPor=0a<matches.lengtha++) {
            var 
p=this.indexOf(matches[a],vamosPor);
            var 
vamosPor=p+matches[a].length;
            
searches[searches.length]=p;
        }
        return [
matches,searches];
    }
    else
        return 
null;

Devuelve un array de dos dimensiones. La primera dimension es un array con todo lo matcheado, y la segunda dimension es un array con las posiciones de lo matcheado. Me ha sido bastante util, pero he tenido que re-escribir todo mi script (además he mejorado un par de cosillas que no estaban controladas).

Bueno, los comentarios del script son mas largos, porque el propio script es más dificil de comprender. Se basa en un esquema simple (para que lo podais seguir mas facilmente):
Código PHP:
/**************** 
REGLA GENERAL, explicacion
****************/
// aposicion1
// aposicion2    
/* 
explicacion gorda, de un bloque entero
*/
--> llamada a la funcion localizar con la expresion
var variable=pal.localizar"expression","modificadores" ); 
--> 
comprobacion de incidencias
if(variable!=null)
--> 
bucle por cada incidenciaDentro del bucle se separara la palabra debidamente
for(var a=0a<variable[1].lengtha++) 
Así que espero que no le tengais miedo al código ahora. Al fin y al cabo, sólo he hecho dos reglas... Este es el codigo completo (los comentarios no los he refinado):

Código PHP:
var palabras=[ "gallo""feo""triangulo""suegra""hablo""lombriz""helicoptero""patata""palabra"];

String.prototype.localizar=function(expReg,modif) {
    
expReg=new RegExp(expReg ,modif);
    
//hacemos el match
    
var matches=this.match(expReg);
    if(
matches!=null) {
        
//este sera el array de almacenamiento de los indices de matches
        
var searches=new Array();
        
//por cada incidencia, añadimos a devolver su posicion
        //vamosPor lleva el control del indice desde el cual empezamos a buscar
        
for(var a=0vamosPor=0a<matches.lengtha++) {
            var 
p=this.indexOf(matches[a],vamosPor);
            var 
vamosPor=p+matches[a].length;
            
searches[searches.length]=p;
        }
        return [
matches,searches];
    }
    else
        return 
null;
}

String.prototype.esVocal=function() {
    return 
this.match(/^[aeiou]$/i)!=null;
}

function 
silabear(pal) {
    
//document.write("ME HAS LLAMADO CON "+pal+":<br>");
    /**************** 
     un argumento de dos letras o de tres letras sera siempre monosilabo
    ****************/
    
if(pal.length<=3) {
        return 
pal;
    }
    
    
//inicializamos _v y _c que nos serviran para formar las expresiones regulares de vocal y consonante
    // a partir de aqui a una vocal se le llamara "v" y a una consonante "c"
    
var _v="[aeiou]"; var _c="[^aeiou]";
    var 
v=new RegExp(_v,"gi"); var c=new RegExp(_c,"gi");
    
    
    
/**************** 
     two consecutive consonants are assigned to separate syllables (e.g. [al.go] algo ‘something’, 
     [ven.ta] venta ‘sale’, [lis.to] listo ‘clever’), except in the case of /p, t, k, b, d, g, f/ + liquid 
     (e.g. [ha.blo] hablo ‘I speak’, [sue.gra] suegra ‘mother-in-law’).
    ****************/
    // a las consonantes excepciones (/p, t, k, b, d, g, f/) las llamaremos cexcep    
    /* tenemos 3 casos:
        1.- consonante no excepcion + consonante
        2.- consonante excepcion + consonante no excepcion
        3.- consonante excepcion + consonante excepcion
    */
    // CASO1: consonante no excepcion + consonante
    
var cc=pal.localizar"[^aeiouptkbdgf][^aeiou]","i" ); 
    if(
cc!=null) {        //hay incidencias
        // por cada conjunto de cc encontrado
        
for(var a=0a<cc[1].lengtha++) {
            
//separamos cada letra para ver si son iguales (doble rr o ll)
            
var cadaletra=cc[0][a].split("");
            if( 
cadaletra[0] != cadaletra[1] ) {
                var 
corte=cc[1][a]+1;
            }
            else {
                var 
corte=cc[1][a];
            }
            var 
parte1=pal.substring(0,corte);
            var 
parte2=pal.substring(corte);
            return [ 
silabear(parte1), silabear(parte2) ];
        }
    }
    
// no cumple cc, pero puede que sea por la excepcion
    
else {
        
// CASO2: consonante excepcion + consonante no excepcion (o si no cogeremos co(pt)ero en helicoptero)
        
var cexcepc=pal.localizar".{1}[ptkbdgf][^aeiouptkbdgf]","gi" );
        if(
cexcepc!=null) {
            for(var 
a=0a<cexcepc[1].lengtha++) {
                var 
parte1=pal.substring(0,cexcepc[1][a]+1);
                var 
parte2=pal.substring(cexcepc[1][a]+1);
                return [ 
silabear(parte1) , silabear(parte2) ];
            }
        }
        
// CASO3: consonante excepcion + consonante excepcion
        
else {
            
cexcepcexcep=pal.localizar"[ptkbdgf]{2}","gi" );
            if( 
cexcepcexcep!=null ) {
                for(var 
a=0a<cexcepcexcep[1].lengtha++) {
                    var 
parte1=pal.substring(0,cexcepcexcep[1][a]+1);
                    var 
parte2=pal.substring(cexcepcexcep[1][a]+1);
                    return [ 
silabear(parte1) , silabear(parte2) ];
                }
            }
        }
    }
    
    
/**************** 
     a single consonant between vowels is syllable-initial (e.g. [pa.ta.ta] patata ‘potato’)
    ****************/
    //miramos si encontramos el esquema v+c+v
    
var vcv=pal.localizar(_v+_c+_v,"gi");
    
//si hay incidencias
    
if(vcv!=null) {
        
//por cada conjunto vcv encontrado
        
for(var a=0a<vcv[1].lengtha++) {
            
//cortaremos la palabra por v|cv, porque la c sera inicio de silaba
            // es decir, donde se encontro vcv (vcv[1][a]) + 1 (por la primera v)
            
var parte1=pal.substring(0,vcv[1][a]+1);
            var 
parte2=pal.substring(vcv[1][a]+1);
            return [ 
silabear(parte1), silabear(parte2) ];
        }
    }
    
    
/*
     devolver el resto de la palabra si no ha de ser procesada
    */
    
return pal;
    
}

for(
a=0;a<palabras.length;a++) {
    
document.writepalabras[a]+" >>> "+silabear(palabras[a]) +"<br/>");

Y esta la salida que provoca:

Cita:
gallo >>> ga,llo
feo >>> feo
triangulo >>> trian,gu,lo
suegra >>> sue,gra
hablo >>> ha,blo
lombriz >>> lom,briz
helicoptero >>> he,li,cop,te,ro
patata >>> pa,ta,ta
palabra >>> pa,la,bra
Así que poco a poco voy mejorando.

El siguiente paso: Las vocales: los hiatos. Las tres consonantes seguidas:
Código PHP:
var palabras=[ "feo""triangulo""transporte""monstruo""fantasia""guion" ]; 
Ahora producen esta salida de momento:
Cita:
feo >>> feo
triangulo >>> trian,gu,lo
transporte >>> tran,s,por,te
monstruo >>> mon,s,truo
fantasia >>> fan,ta,sia
guion >>> guion
Pero ya saldra...



Parece que lo voy logrando! Deseadme suerte...

Saludos y gracias!


PD: Lo siento por el gigantesquisimo post, creo que no habia escrito uno asi en la vida. Quiero que sea facil y llevadero de entender...
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.