Foros del Web » Programando para Internet » Javascript »

eliminar lo común entre dos strings

Estas en el tema de eliminar lo común entre dos strings en el foro de Javascript en Foros del Web. Tengo una duda grande. Poseo dos url con una parte en comun, la del principio, y quisiera eliminar esa parte. Es decir: str1="http://www.miweb.com/carpeta/doc.htm"; str2="http://www.miweb.com/carpeta/otracarpeta/miotrodoc.htm"; Al ...
  #1 (permalink)  
Antiguo 24/01/2004, 19:10
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
eliminar lo común entre dos strings

Tengo una duda grande. Poseo dos url con una parte en comun, la del principio, y quisiera eliminar esa parte. Es decir:

str1="http://www.miweb.com/carpeta/doc.htm";
str2="http://www.miweb.com/carpeta/otracarpeta/miotrodoc.htm";

Al ejecutar la funcion con str1 (modelo) y str2 (se que va a ser la que variará), deberia devolver "otracarpeta/miotrodoc.htm"; exactamente, es decir, lo que no tiene en comun con str1.

Algo he hecho, pero resulta demasiado lento, y si no lo ejecuto en un setTimeout("function()",1); no me funciona, me da que el script se ejecuta por demasiado tiempo, como si hubiera hecho un bucle infinito. Mi codigo es este:


Código PHP:
function prepararRUTA(ruta) {
    
//  (por bloques de directorios)
    
ruta=ruta.split("/");
    
direSplit=window.location.href.split("/");
    
indice=0;
    while(
ruta[indice]==direSplit[indice] && indice<ruta.length && indice<direSplit.length) {
        
ruta[indice]="eliminar";
        
indice++;
    }
    for(
a=0;a<ruta.length;a++)    //eliminamos los elementos "eliminar"
        
if(ruta[a]=="eliminar") { ruta.splice(a,1); a--; }
    
ruta=ruta.join("/");
    return 
ruta;


Lo explicare un poco. Divide ruta en directorios (split("/")) y hace lo propio con la direccion actual (que seria str1, la url fija). Mientras los elementos de ruta y direSplit sean iguales, a ese elemento de ruta que se está tratando se le otorga el valor "eliminar". El bucle while termina si los directorios llegan a ser diferentes o si indice es mayor que alguno de los dos length (de ruta y direSplit). Despues recorremos ruta para localizar los elementos que contengan "eliminar" y los eliminamos del array (modificando su length, con el metodo splice poco conocido -al menos por mi-). Entonces deshacemos el split("/") con join("/") y la cadena esta preparada para ser devuelta.


Lo dicho, funcionar me funciona, pero es demasiado lento. Ojala se les ocurra alguna manera mas sencilla para solucionarlo.

Un saludo
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #2 (permalink)  
Antiguo 25/01/2004, 05:37
Avatar de JavierB
Colaborador
 
Fecha de Ingreso: febrero-2002
Ubicación: Madrid
Mensajes: 25.052
Antigüedad: 22 años, 2 meses
Puntos: 772
Hola, derkenuke.

Acabo de probar tu código y ha funcionado bien. Devuelve "otracarpeta/miotrodoc.htm", como tu dijiste y no ha tardado nada en ejecutarse

Saludos,
  #3 (permalink)  
Antiguo 25/01/2004, 07:39
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
re

¿Podrias probar esto y decirme?


Código PHP:
function prepararRUTA(ruta) {
    
//  (por bloques de directorios)
    
ruta=ruta.split("/");
    
direSplit=window.location.href.split("/");
    
indice=0;
    while(
ruta[indice]==direSplit[indice] && indice<ruta.length && indice<direSplit.length) {
        
ruta[indice]="eliminar";
        
indice++;
    }
    for(
a=0;a<ruta.length;a++)    //eliminamos los elementos "eliminar"
        
if(ruta[a]=="eliminar") { ruta.splice(a,1); a--; }
    
ruta=ruta.join("/");
    return 
ruta;
}

var 
rutas=new Array();
rutas[0]="http://localhost/micarpeta/carpdiferente0/otrodoc0.htm";
rutas[1]="http://localhost/micarpeta/carpdiferente1/otrodoc1.htm";
rutas[2]="http://localhost/micarpeta/carpdiferente2/otrodoc2.htm";
rutas[3]="http://localhost/micarpeta/carpdiferente3/otrodoc3.htm";
rutas[4]="http://localhost/micarpeta/carpdiferente4/otrodoc4.htm";

var 
preparadas=new Array();
for(
a=0;a<rutas.length;a++) preparadas[a]=prepararRUTA(rutas[a]);

alert(preparadas.join("\n")); 

Acabo de hacer el codigo y no lo he probado, puede que tenga algun error, tendras que modificar algo para que funcione bien. Si te funciona como deberia funcionar tengo el ordenador un poco raro .



Un saludo
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #4 (permalink)  
Antiguo 25/01/2004, 08:05
Avatar de tunait
Moderadora
 
Fecha de Ingreso: agosto-2001
Ubicación: Terok Nor
Mensajes: 16.805
Antigüedad: 22 años, 8 meses
Puntos: 381
Hola

Si lo que quieres es siempre sacar la misma subcadena (osea, es algo fijo) por qué no lo haces así?


str1="http://www.miweb.com/carpeta/doc.htm";
str2="http://www.miweb.com/carpeta/otracarpeta/miotrodoc.htm";
subCa = new RegExp("http://www.miweb.com/carpeta/")
str1= str1.replace(subCa,'')
str2 = str2.replace(subCa,'')

alert(str1)
alert(str2)

  #5 (permalink)  
Antiguo 25/01/2004, 08:57
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
re

Aiba, no se me habia ocurrido, haber si me funciona..

Gracias
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #6 (permalink)  
Antiguo 25/01/2004, 09:29
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Me ha funcionado perfectamente, ahora va muy rapido, gracias tunait!
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #7 (permalink)  
Antiguo 25/01/2004, 09:33
Avatar de tunait
Moderadora
 
Fecha de Ingreso: agosto-2001
Ubicación: Terok Nor
Mensajes: 16.805
Antigüedad: 22 años, 8 meses
Puntos: 381
Óle
  #8 (permalink)  
Antiguo 31/01/2007, 09:31
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Re: eliminar lo común entre dos strings

He revisado este mensaje y ahora que he mejorado el nivel (hace más de 3 años de este post!) pues he hecho esto, por si lo común entre los dos no sabemos cuánto es:

Código PHP:
function loComun(str1,str2) {
    var 
voypor=0;
    do {
        
re=new RegExp"^"+str1.substring(0,voypor++) );
    } while( 
str2.matchre )!=null )
    return 
str1.substring(0,voypor-2);
}

var 
str1="lo común entre los dos";
var 
str2="lo común tienes que hallar";
document.write("comun('"+str1+"','"+str2+"') => '"+loComun(str1,str2)+"'<br/>");
var 
str1="mira que lámpara más fea";
var 
str2="mira que lámpara más bonita";
document.write("comun('"+str1+"','"+str2+"') => '"+loComun(str1,str2)+"'<br/>");
var 
str1="no tengo nada que ver";
var 
str2="con la cadena que acompaño";
document.write("comun('"+str1+"','"+str2+"') => '"+loComun(str1,str2)+"'<br/>"); 
Lo que es común tiene que estar al principio de la cadena, pero funciona de perlas. Me podría haber servido entonces, y además no es tan lento.
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
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 11:06.