martes, 16 de diciembre de 2008

replace all en Javascript

Hace unos dias. ayude aun compañero con un javascript. y me encontre con la sorpresa de que el replace de javascript solo remplaza la primera coincidencia y no sigue buscando en el string.


function replaceAll( text, busca, reemplaza ){
while (text.toString().indexOf(busca) != -1)
text = text.toString().replace(busca,reemplaza);
return text;
}



El ejemplo en particular era que teniamos que sacar todos los puntos de un numero.

>>>replaceAll("123.345.567", ".", "" );
>>"123345567"



De esta forma por ejemplo podriamos convertirlo en un int. pero la funcion es mas generica, remplaza cualquier caracter por otro, ambos pasados como parametros a la funcion.

--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

44 comentarios:

  1. Respuestas
    1. Que elegancia ;) gracias man

      Eliminar
    2. clase de brujería, aun hoy sigue siendo infalible

      Eliminar
    3. Gracias, me sirivio mucho.
      http://nubesito.com

      Eliminar
    4. It's awesome! You're awesome!

      Eliminar
  2. foo.replace(/\./g, '')

    "g" stands for global

    ResponderEliminar
  3. Is very good. This solution is very fast to implement.

    Thanks.
    --
    Atte.
    Victor Hugo saavedra
    http://vhspiceros.blogspot.com

    ResponderEliminar
  4. Muchas gracias!!!! La verdad es que me vino genial. Saludos!!

    :)

    ResponderEliminar
  5. La funcion podria entrar en un bucle infinito
    replaceAll( text, busca, reemplaza )
    tiene la restriccion que el texto del parametro busca no puede estar dentro lo que se quiere reemplazar

    No funciona para un caso similar a
    replaceAll( "Hola mundo!", "!", "!!" )

    ResponderEliminar
    Respuestas
    1. Buclazo infinito!!! XD
      Mucho mejor con una RegExp:
      foo.replace(/\./g, '')

      Eliminar
  6. efectivamente tiene esa limitancia.


    es mucho mejor hacer foo.split('.').join('') como puse en un comentario mas arriba,

    ResponderEliminar
  7. string.replace(/\./g, '');

    ResponderEliminar
  8. Muchas gracias!!! Me ha venido fenomenal

    ResponderEliminar
  9. La funcion replace si puede sustituir todos los caracteres, no solo el primero, escribiendo el siguiente codigo:

    cadena = cadena.replace(/buscar/g, "reemplazar")

    Y esta comprobado.

    Un saludo

    ResponderEliminar
  10. facil y efectivo gracias..
    Lo utilize para revertir desde formtao español de numeros, es decir, con . milesimas y , decimales, a formato ingles solo con . los decimales
    Ej:
    75.000,89 => 75000.89

    ResponderEliminar
  11. Muchas gracias Victor por tu aporte, lo utilicé con sugarcrm.
    Sugar guarda el valor de un select multiple de esta forma ^valor^,^valor1^ y asi sucesivamente, primero hice un split sobre las comas y después apliqué tu funcion para quitarle los ^.
    Gracias.

    ResponderEliminar
  12. Excelente Francisco. que bueno que te halla sido de utilidad esta entrada :D

    ResponderEliminar
  13. Y como se puede reemplazar usando variables?

    var str="reemplaza las cadenas a buscar";
    var buscar="las";
    var reemplaza="por";
    alert(str.replace(/buscar/gi,reemplaza));

    ResponderEliminar
  14. Muchas gracias, me fue de gran ayuda, tenia que reemplazar en una cadena el simbolo $ por el S/. que es la moneda de perú, pero me encontre que la / javascript me la toma como un limitador

    ResponderEliminar
  15. Respondiendo a "anonimo" que dijo:

    La funcion podria entrar en un bucle infinito
    replaceAll( text, busca, reemplaza )
    tiene la restriccion que el texto del parametro busca no puede estar dentro lo que se quiere reemplazar

    No funciona para un caso similar a
    replaceAll( "Hola mundo!", "!", "!!" )

    --------

    Agregale un "startIndex" al .indexOf para que no busque en los que ya reemplazó:

    [js]
    function replaceAll( text, busca, reemplaza ){
    var idx = text.toString().indexOf(busca);
    while (idx != -1) {
    text = text.toString().replace(busca,reemplaza);
    idx = text.toString().indexOf(busca, idx);
    }
    return text;
    }
    [/js]

    ResponderEliminar
  16. Gracias tios me sirvio, sois la puta ostia!

    ResponderEliminar
  17. si el caracter esta al inicio de la frace y este se repite varias veces no me funciona .replace(/buscar/g,reemplaza) tampoco .split(buscar).join(reemplaza, quisiera hacerlo todo en una linea

    ResponderEliminar
  18. Windows Live ID requires JavaScript to sign in. This web browser either does not support JavaScript, or scripts are being blocked.

    To find out whether your browser supports JavaScript, or to allow scripts, see the browser's online help.

    Tratando de entrar a la cuenta de hotmail, alguien puede indicarme que debo hacer?
    Muchas gracias!

    ResponderEliminar
    Respuestas
    1. Tu navegador no soporta Javascript o lo tienes deshabilitado, revisa la configuración del navegador o usa uno que sí soporte Javascript, por ejemplo Google Chrome.

      Saludos!

      Eliminar
  19. Thank you very much! So simple and so powerful!

    ResponderEliminar
  20. Perfecto, ahora podré agregar el caractér ­ a todas las palabras que tengan demasiadas letras. El replace de JS sólo estaba reemplazando la primera ocurrencia.

    ResponderEliminar
  21. en realidad no es una limitacion, es que no estas escribiendo el regex como se debe :D
    fijate

    var str1 = "1,2,3,4,5,6"
    str1.replace(",","") //solo te va a remplazar una coma, ya que al usar comillas se hace entender que buscas un caracter especifico

    str1.replace(/,/g,"") al utilizar la combinacion de // con g le indicas que quieres capturar cada caracter..

    ResponderEliminar
  22. Jodida Hostia me ha resultado

    ResponderEliminar
  23. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  24. Simple y funciona genial.
    ¡Gracias!

    ResponderEliminar
  25. Muchas Gracias me saco de un gran inconveniente que tenia. AP

    ResponderEliminar
  26. Muchas gracias por el código!

    ResponderEliminar
  27. hermano un monton de gracias, tenia problemas al hacer el set de mi token en local storage de angularjs por alguna se colaban un par de comillas de mas al inicio y al final de mi estring token y tu funcion me soluciono el dia, saludos desde venezuela de @lordcasslos

    ResponderEliminar
  28. Busque mucho y fuiste la única solición.

    Saludos y gracias!!

    ResponderEliminar