Foros del Web » Programando para Internet » Javascript »

Codificar los acentos a sus entidades HTML con expresiones regulares

Estas en el tema de Codificar los acentos a sus entidades HTML con expresiones regulares en el foro de Javascript en Foros del Web. Hola señores A través de ajax paso valores a la base de datos de ciertos campos que los usuarios rellenan. El caso es que necesitaba ...
  #1 (permalink)  
Antiguo 10/04/2011, 07:54
Avatar de junihh  
Fecha de Ingreso: febrero-2004
Ubicación: República Dominicana
Mensajes: 997
Antigüedad: 20 años, 2 meses
Puntos: 7
Codificar los acentos a sus entidades HTML con expresiones regulares

Hola señores

A través de ajax paso valores a la base de datos de ciertos campos que los usuarios rellenan. El caso es que necesitaba convertir los acentos de dichos campos a sus entidades en HTML ("á", "ñ", etc.) y luego de buscar un poco, preparé dos funciones para hacer el encode y decode basándome en expresiones regulares.

Me gustó mucho esa alternativa, por su rapidez y el mínimo uso de recursos del navegador. Estas son las funciones que ahora tengo:

Código HTML:
var accentEncode = function (tx)
{
	var rp = String(tx);
	//
	rp = rp.replace(/á/g, 'á');
	rp = rp.replace(/é/g, 'é');
	rp = rp.replace(/í/g, 'í');
	rp = rp.replace(/ó/g, 'ó');
	rp = rp.replace(/ú/g, 'ú');
	rp = rp.replace(/ñ/g, 'ñ');
	rp = rp.replace(/ü/g, 'ü');
	//
	rp = rp.replace(/Á/g, 'Á');
	rp = rp.replace(/É/g, 'É');
	rp = rp.replace(/Í/g, 'Í');
	rp = rp.replace(/Ó/g, 'Ó');
	rp = rp.replace(/Ú/g, 'Ú');
	rp = rp.replace(/Ñ/g, 'Ñ');
	rp = rp.replace(/Ü/g, 'Ü');
	//
	return rp;
};

var accentDecode = function (tx)
{
	var rp = String(tx);
	//
	rp = rp.replace(/á/g, 'á');
	rp = rp.replace(/é/g, 'é');
	rp = rp.replace(/í/g, 'í');
	rp = rp.replace(/ó/g, 'ó');
	rp = rp.replace(/ú/g, 'ú');
	rp = rp.replace(/ñ/g, 'ñ');
	rp = rp.replace(/ü/g, 'ü');
	//
	rp = rp.replace(/Á/g, 'Á');
	rp = rp.replace(/É/g, 'É');
	rp = rp.replace(/Í/g, 'Í');
	rp = rp.replace(/Ó/g, 'Ó');
	rp = rp.replace(/Ú/g, 'Ú');
	rp = rp.replace(/&Ñtilde;/g, 'Ñ');
	rp = rp.replace(/&Üuml;/g, 'Ü');
	//
	return rp;
};
Ambas funciones hacen el trabajo que deben, pero mi pregunta es si existe una forma también con expresiones regulares para evitar hacer tantos replace por cada carácter. Pensé en usar "for" o "while" guardando los carácteres en arrays, pero toma recursos del navegador que precisamente quiero evitar. ¿Alguna sugerencia?

Gracias de antemano a cualquier idea o ayuda que me puedan facilitar.
__________________
JuniHH
- Mi blog
- Mi portafolio
  #2 (permalink)  
Antiguo 10/04/2011, 09:02
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años
Puntos: 1485
Respuesta: Codificar los acentos a sus entidades HTML con expresiones regulares

buenas,
antes de responder a esa duda, me pregunto por que queras hacerlo desde javascript habiendo otras soluciones mas fiables. por ejemplo, es obvio que si estas usando base de datos tambien estas usando lenguaje servidor. lo mas seguro, tu lenguaje servidor debe tener alguna funcion para el proposito de convertir los caracteres a entidades html cuando sea aplicable. por ejemplo, php tiene las funciones htmlentities y htmlspecialchars. decodificarlo no haria falta porque el navegador puede interpretarlo correctamente.

ahora bien, si igual quieres hacerlo en javascript. lo que se me ocurre es una expresion regular con una clase que incluya todos los caracteres a buscar. luego, en lugar de usar un string en el segundo parametro de replace, pasas una funcion que recibira el caracter encontrado por replace. en esta funcion, vas a tener un objeto definido -tambien ser definido en el exterior- que funcione a manera de mapa donde el nombre de la propiedad es el caracter encontrado y el valor es el string a ser devuelto. luego devuelves el pareo entre el primer parametro de la funcion y el objeto.

para el proceso reverso, de entidad a caracter, creo que es irrelevante porque el navegador debe ser capaz de interpretarlo correctamente.

__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #3 (permalink)  
Antiguo 10/04/2011, 09:37
Avatar de junihh  
Fecha de Ingreso: febrero-2004
Ubicación: República Dominicana
Mensajes: 997
Antigüedad: 20 años, 2 meses
Puntos: 7
Respuesta: Codificar los acentos a sus entidades HTML con expresiones regulares

Creo que tienes razón zerokilled. Buscaré más información para que el proceso sea desde PHP, lo que estoy usando para servidor. Muchas gracias por tu respuesta.
__________________
JuniHH
- Mi blog
- Mi portafolio
  #4 (permalink)  
Antiguo 10/04/2011, 09:38
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 19 años, 10 meses
Puntos: 834
Respuesta: Codificar los acentos a sus entidades HTML con expresiones regulares

Opino igual que Zerokilled: es mejor hacerlo del lado del servidor. Tampoco deberías estar tan seguro acerca de que hacerlo con expresiones regulares tiene una mejor performance que un loop. Deberías probarlo. Este test muestra que no siempre es así: http://jsperf.com/regex-vs-for-loop/4
Y eso se debe a que internamente los metodos de regexp también realizan búsquedas y usan recursividad. Es interesante estudiar un motor de javascript realizado en algún lenguaje que conozcamos para comprender este tipo de cosas. Por ejemplo: http://j4p5.sourceforge.net/
Si yo tuviera que hacer algo así usaría algo como esto:
Código PHP:
function htmlEntities(texto){
    
//by Micox - elmicoxcodes.blogspot.com - www.ievolutionweb.com
    
var i,carac,letra,novo='';
    for(
i=0;i<texto.length;i++){
        
carac texto[i].charCodeAt(0);
        if( (
carac 47 && carac 58) || (carac 62 && carac 127) ){
            
//se for numero ou letra normal
            
novo += texto[i];
        }else{
            
novo += "&#" carac ";";
        }
    }
    return 
novo;

  #5 (permalink)  
Antiguo 10/04/2011, 10:10
Avatar de junihh  
Fecha de Ingreso: febrero-2004
Ubicación: República Dominicana
Mensajes: 997
Antigüedad: 20 años, 2 meses
Puntos: 7
Respuesta: Codificar los acentos a sus entidades HTML con expresiones regulares

Panino

De verdad que me sorprendió esa prueba. En mi caso con Chrome 11.0.696, el "regex" dió 8,609,624 contra el impresionante 15,220,964 del "for". Como sugirió Zerokilled, voy a hacer encode con PHP antes de guardar a la base de datos y decode al reimprimir el contenido del lado del cliente.

Muchas gracias a ambos, sus sugerencias me sirvieron de mucho.
__________________
JuniHH
- Mi blog
- Mi portafolio

Etiquetas: acentos, codificar, expresiones, html, regulares
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 12:18.