En JavaScript, si queremos reemplazar en una cadena de texto, una subcadena por otra, se usa generalmente el método replace. Este método admite para buscar una subcadena lo mismo un String que una RegExp. Veamos a continuación cómo se usa este método:
Usando una cadena
var cadena = "Can you can the can that I can can?";
console.log( cadena.replace("can", "kick") );
// Can you kick the can that I can can?
Usando una expresión regular
var cadena = "Can you can the can that I can can?";
console.log( cadena.replace(/can/gi, "kick") );
// kick you kick the kick that I kick kick?
Si en alguna ocasión necesitamos reemplazar más de un valor por otro, normalmente se usa la concatenación de varios métodos replace:
Reemplazar varias subcadenas por otras
var cadena = "Can you can the can that I can can?";
console.log( cadena.replace("Can", "Could").replace("can", "kick") );
// Could you kick the can that I can can?
Sin embargo en PHP existe la función str_replace que admite o un String o un Array. Si podemos enviar un Array de subcadenas a buscar y un Array de subcadenas a reemplazar sería mucho más versátil realizar varios reemplazos. Así que replicaremos la función str_replace en JavaScript:
Replicando la función str_replace en JavaScript
function str_replace($search, $replace, $subject){
//Conformar la expresión regular a buscar
var reg;
//Si el parámetro $search es un String
if( typeof($search) == "string" ){
//Escapar los caracteres usados por las expresiones regulares
$search = $search.replace(/[.?*+^$[\]\\(){}|-]/g, "\\$&");
reg = new RegExp("(" + $search + ")", "g");
}else{
//Escapar los caracteres usados por las expresiones regulares
$search = $search.map(function(i){
return i.replace(/[.?*+^$[\]\\(){}|-]/g, "\\$&");
});
reg = new RegExp("(" + $search.join("|") + ")", "g");
}
//Conformar el reemplazo
var rep;
//Si el parámetro $replace es un String
if( typeof($replace) == "string" ){
rep = $replace;
}else{
//Si el parámetro $search es un String y el parámetro $replace un Array
if( typeof($search) == "string" ){
rep = $replace[0];
//Si el parámetro $search es un Array y el parámetro $replace un Array
}else{
rep = function(i){
return $replace[ $search.indexOf(i) ];
}
}
}
return $subject.replace(reg, rep);
}
Función reducida de str_replace en JavaScript
Esta función se puede reducir al mínimo y quedaría de la siguiente manera:
function str_replace($f, $r, $s){
return $s.replace(new RegExp("(" + (typeof($f) == "string" ? $f.replace(/[.?*+^$[\]\\(){}|-]/g, "\\$&") : $f.map(function(i){return i.replace(/[.?*+^$[\]\\(){}|-]/g, "\\$&")}).join("|")) + ")", "g"), typeof($r) == "string" ? $r : typeof($f) == "string" ? $r[0] : function(i){ return $r[$f.indexOf(i)]});
}
Y podríamos usarla de la siguiente manera:
var cadena = "Can you can the can that I can can?";
console.log( str_replace(["Can", "can"], ["Could", "kick"], cadena) );
// Could you kick the kick that I kick kick?
Puedes situar fragmentos de código dentro de etiquetas <pre></pre> y código HTML o XML entre etiquetas <xmp></xmp>.