2012-08-02 18 views
11

Ho ottenuto questo bel codice, che non ho idea del perché non funzioni. Dovrebbe ottenere il valore di un input di testo e sostituire ogni dato carattere nazionale con il suo codice HTML, a fini di compatibilità. Ma quando clicco sul pulsante, la funzione restituisce la stringa senza alcuna modifica. Qualche idea?Sostituisci più caratteri in una stringa in 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

Funziona per me (ho usato 'console.log') – SomeKittens

+0

non si assegna mai il valore all'elemento dopo aver eseguito tutte le sostituzioni. – jbabey

+0

Si scopre che in realtà non avevo bisogno della codifica UTF. Lo stavo solo usando, perché l'intero sito web lo usa, e ho pensato che fosse necessario. Fondamentalmente, non ho bisogno del codice per sostituire i caratteri nazionali, perché sembrano buoni anche senza di esso. – SeinopSys

risposta

9

Si può solo replace tutto a livello di codice, non si utilizza entità con nome:

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)+";"; 
}); 

Se si desidera utilizzare entità con nome, è possibile combinare questo con un valore-chiave mappa (come come in @jackwanders risposta) :

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

Tuttavia, si dovrebbe mai bisogno di utilizzare entità HTML in JavaScript. Usa UTF8 come codifica dei caratteri per tutto, e funzionerà.

+0

Utilizzando la risposta di @jackwanders, nella seconda parte del codice, Come inserisco i caratteri? Se provo a utilizzare il formato **/\ u00E1/** ottengo errori. – SeinopSys

+0

Dove lo usi? Se hai ancora una codifica difettosa, devi sfuggire alle chiavi dell'oggetto della mappa. – Bergi

1

Penso che si stanno avendo un problema con la sola sostituzione della prima istanza di un carattere. In javascript bisogna specifiy sostituisce globali mediante espressioni regolari come questo:

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

sarebbe meglio per creare un array come detto da PPvG o jackwanders, ma per il resto atleast riutilizzare la variabile esistente. Si potrebbe facilmente fare in questo modo:

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

Questo non funziona neanche: \ – SeinopSys

+0

Come ho detto, questo metodo solo di nuovo, restituisce il valore così com'è e non fa nulla con esso. – SeinopSys

+0

@ DJDavid98 Concordo sul fatto che questo non sembra essere il motivo per cui non si sta sostituendo, tuttavia è necessario eseguire una sostituzione globale come consigliato. Raccomando anche di usare un array come menzionato da PPvG e Jackwanders. –

9

è possibile creare un oggetto che ha coppie chiave/valore per ogni carattere per sostituire:

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

e quindi utilizzare una funzione nella vostra .replace chiamata:

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

vostro alloggio e di espressione regolare, ovviamente, bisogno di crescere per includere tutti i caratteri che si desidera sostituire

3

I caratteri sono soggetti alla codifica della pagina HTML, della pagina JavaScript e della richiesta HTTP. Prova a sostituire i caratteri con i relativi equivalenti 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> 

Controlla bene le mie conversioni per essere sicuro. Ho usato la griglia su Wikibooks.

+0

SÌ! Grazie, sembra che la sostituzione Unicode l'abbia risolto. – SeinopSys

+1

Se quella era una soluzione, allora dovresti correggere la tua codifica. Ad ogni modo, dovresti migliorare il tuo algoritmo, vedere la risposta di Jackwanders o la mia. – Bergi

+1

Sostituisce solo la prima istanza di ogni carattere. Ecco un esempio: http://jsfiddle.net/hHZhv/1 –

Problemi correlati