2012-08-02 32 views
11

Recibí este bonito código, que no tengo ni idea de por qué no funciona. Debería obtener el valor de una entrada de texto y reemplazar cada carácter nacional dado con su código HTML, por razones de compatibilidad. Pero, cuando hago clic en el botón, la función devuelve la cadena sin ningún cambio. ¿Alguna idea?Reemplazar varios caracteres en una cadena en javascript

(jsfiddle)

<a id="reminder1" onclick="document.getElementById('reminder2').style.display = ''; document.getElementById('reminder1').style.display = 'none';"> 
    Set reminder 
</a> 
<a id="reminder2" class="reminder" style="display:none;"> 
    <input type="text" id="reminderh" size=40 style="font-size:20px;"> 
    <input type="button" value="Set" onclick="csere(document.getElementById('reminderh').value);"> 
</a> 

<script> 
function csere(qwe){ 
document.getElementById('reminder2').style.display = 'none'; 

var rtz0 = qwe.replace("á","&aacute;"); 
var rtz1 = rtz0.replace("Á","&Aacute;"); 

var rtz2 = rtz1.replace("é","&eacute;"); 
var rtz3 = rtz2.replace("É","&Eacute;"); 

var rtz4 = rtz3.replace("í","&iacute;"); 
var rtz5 = rtz4.replace("Í","&Iacute;"); 

var rtz6 = rtz5.replace("ö","&ouml;"); 
var rtz7 = rtz6.replace("Ö","&Ouml;"); 
var rtz8 = rtz7.replace("ő","&&#337;"); 
var rtz9 = rtz8.replace("Ő","&#336;"); 
var rtz10 = rtz9.replace("ó","&oacute;"); 
var rtz11 = rtz10.replace("Ó","&Oacute;"); 

var rtz12 = rtz11.replace("ü","&uuml;"); 
var rtz13 = rtz12.replace("Ü","&Uuml;"); 
var rtz14 = rtz13.replace("ű","&#369;"); 
var rtz15 = rtz14.replace("Ű","&#368;"); 
var rtz16 = rtz15.replace("ú","&uacute;"); 
var uio = rtz16.replace("Ú","&Uacute;"); 

//Creates a cookie with the final value (different function) 
createCookie('reminder',uio,1500); 

document.getElementById('reminder1').style.display = ''; 
} 
</script> 
+0

Funciona para mí (utilicé 'console.log') – SomeKittens

+0

nunca se asigna el valor de nuevo al elemento después de hacer todas las sustituciones. – jbabey

+0

Resulta que realmente no necesitaba la codificación UTF. Solo lo estaba usando, porque todo el sitio web lo usa, y pensé que era necesario. Básicamente, no necesito código para reemplazar caracteres nacionales, porque parecen estar bien incluso sin él. – SeinopSys

Respuesta

9

Usted puede simplemente replace todo mediante programación, no usar entidades nombradas:

return input.replace(/[^ -~]/g, function(chr) { 
//     ^^^^^^ 
// this is a regexp for "everything than printable ASCII-characters" 
// and even works in a ASCII-only charset. Identic: [^\u0020-\u007E] 
    return "&#"+chr.charCodeAt(0)+";"; 
}); 

Si desea utilizar entidades nombradas, puede combinar esto con un valor-mapa de teclado (como al igual que en @jackwanders respuesta) :

var chars = { 
    "á" : "&aacute;", 
    "Á" : "&Aacute;", 
    "é" : "&eacute;", 
    "É" : "&Eacute;", 
    ... 
} 
return input.replace(/[^ -~]/g, function(chr) { 
    return (chr in chars) 
     ? chars[chr] 
     : "&#"+chr.charCodeAt(0)+";"; 
}); 

Sin embargo, nunca debe necesitar usar entidades hTML en JavaScript. Use UTF8 como la codificación de caracteres para todo, y funcionará.

+0

Usando @jackwanders, responda, en la segunda parte del código, ¿cómo coloco los caracteres? Si trato de usar el formato **/\ u00E1/**, obtengo errores. – SeinopSys

+0

¿Dónde lo usas? Si aún tiene una codificación defectuosa, deberá escapar de las claves del objeto del mapa. – Bergi

1

Creo que usted está teniendo un problema con la única sustitución de la primera instancia de un personaje. En javascript que tiene que specifiy sustituye globales utilizando expresiones regulares como esto:

var rtz0 = qwe.replace(new RegExp("á", "g"), "&aacute;"); 

que sería mejor para crear una matriz como se ha mencionado por PPvG o jackwanders, pero por lo demás al menos volver a utilizar la variable existente. Usted puede fácilmente hacerlo de esta manera:

qwe = qwe.replace(new RegExp("á", "g"), "&aacute;"); 
qwe = qwe.replace(new RegExp("Á", "g"), "&Aacute;"); 
+0

Esto tampoco funciona: \ – SeinopSys

+0

Como dije, este método simplemente vuelve a mostrar el valor tal como está y no hace nada con él. – SeinopSys

+0

@ DJDavid98 Estoy de acuerdo en que esta no parece ser la razón por la cual no está reemplazando, sin embargo, tendrá que hacer un reemplazo global como lo recomendé. También recomiendo usar una matriz como lo mencionan PPvG y jackwanders. –

9

Se puede crear un objeto que tiene pares clave/valor para cada personaje para reemplazar:

var chars = { 
    "á" : "&aacute;", 
    "Á" : "&Aacute;", 
    "é" : "&eacute;", 
    "É" : "&Eacute;", 
    ... 
} 

y luego usar una función en su llamada .replace:

var uio = qwe.replace(/[áÁéÉ]/g,function(c) { return chars[c]; }); 

Su objeto y expresión regular obviamente tendrá que crecer para incluir todos los caracteres que desea reemplazar

3

Los caracteres están sujetos a la codificación de la página HTML, la página JavaScript y la solicitud HTTP. Intente reemplazar los caracteres con sus equivalentes Unicode:

<a id="reminder1" onclick="document.getElementById('reminder2').style.display = ''; document.getElementById('reminder1').style.display = 'none';"> 
    Set reminder 
</a> 
<a id="reminder2" class="reminder" style="display:none;"> 
    <input type="text" id="reminderh" size=40 style="font-size:20px;"> 
    <input type="button" value="Set" onclick="csere(document.getElementById('reminderh').value);"> 
</a> 

<script> 
function csere(qwe){ 
document.getElementById('reminder2').style.display = 'none'; 

var rtz0 = qwe.replace(/\u00E1/,"&aacute;"); 
var rtz1 = rtz0.replace(/\u00C1/,"&Aacute;"); 

var rtz2 = rtz1.replace(/\u00E9/,"&eacute;"); 
var rtz3 = rtz2.replace(/\u00C9/,"&Eacute;"); 

var rtz4 = rtz3.replace(/\u00ED/,"&iacute;"); 
var rtz5 = rtz4.replace(/\u00CD/,"&Iacute;"); 

var rtz6 = rtz5.replace(/\u00F6/,"&ouml;"); 
var rtz7 = rtz6.replace(/\u00D6/,"&Ouml;"); 
var rtz8 = rtz7.replace(/\u00F5/,"&&#337;"); 
var rtz9 = rtz8.replace(/\u00D5/,"&#336;"); 
var rtz10 = rtz9.replace(/\u00F3/,"&oacute;"); 
var rtz11 = rtz10.replace(/\u00D3/,"&Oacute;"); 

var rtz12 = rtz11.replace(/\u00FC/,"&uuml;"); 
var rtz13 = rtz12.replace(/\u00DC/,"&Uuml;"); 
var rtz14 = rtz13.replace(/\u0171/,"&#369;"); 
var rtz15 = rtz14.replace(/\u0170/,"&#368;"); 
var rtz16 = rtz15.replace(/\u00FA/,"&uacute;"); 
var uio = rtz16.replace(/\u00DA/,"&Uacute;"); 

//Creates a cookie with the final value (different function) 
createCookie('reminder',uio,1500); 

document.getElementById('reminder1').style.display = ''; 
} 
</script> 

Revise mis conversiones para estar seguro. Utilicé la grilla en Wikibooks.

+0

¡SÍ! Gracias, parece que el reemplazo de Unicode lo resolvió. – SeinopSys

+1

Si esa fue una solución, entonces debe corregir su codificación. De todos modos, deberías mejorar tu algoritmo, ver la respuesta de Jackwanders o la mía. – Bergi

+1

Esto solo reemplazará la primera instancia de cada personaje. Aquí hay un ejemplo: http://jsfiddle.net/hHZhv/1 –

Cuestiones relacionadas