str_replace de PHP en JavaScript

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?
Share on FacebookTweet about this on TwitterShare on Google+Share on LinkedInShare on StumbleUpon

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Puedes situar fragmentos de código dentro de etiquetas <pre></pre> y código HTML o XML entre etiquetas <xmp></xmp>.

Time limit is exhausted. Please reload CAPTCHA.