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.match( c_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á:
y de ello me interesaba sacar la posicion. Lo hacía con search, teniendo por resultado
y no
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=0, vamosPor=0; a<matches.length; a++) {
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 incidencia. Dentro del bucle se separara la palabra debidamente
for(var a=0; a<variable[1].length; a++)
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=0, vamosPor=0; a<matches.length; a++) {
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=0; a<cc[1].length; a++) {
//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=0; a<cexcepc[1].length; a++) {
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=0; a<cexcepcexcep[1].length; a++) {
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=0; a<vcv[1].length; a++) {
//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.write( palabras[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...