2011-01-24 9 views

risposta

11
<div id="foo">&darr;</div> 

alert(document.getElementById("foo").innerHTML.length); // alerts 1 

Quindi, sulla base che razionale, creare un div, aggiungere il tuo entità mescolati cavalcato stringa ad esso, estrarre il codice HTML e controllare la lunghezza.

var div = document.createElement("div"); 
div.innerHTML = "&darr;&darr;&darr;&darr;"; 
alert(div.innerHTML.length); // alerts 4 

Try it here.

Si potrebbe desiderare di mettere che in una funzione per comodità, ad esempio:

function realLength(str) { // maybe there's a better name? 
    var el = document.createElement("div"); 
    el.innerHTML = str; 
    return el.innerHTML.length; 
} 
+3

Soluzione intrigante. –

+0

I [modified the fiddle] (http://jsfiddle.net/e89hJ/1/) e ho testato questa soluzione contro gli input e gli output della soluzione basata su libreria che ho postato e c'era qualche incoerenza. Vale a dire, ho inserito un input codificato e ottenuto 110 caratteri, quindi ho inserito un input decodificato degli stessi dati e ottenuto 96 caratteri. Non sei sicuro del perché esattamente, ma potrebbe valerne la pena. –

+0

@Nathan Taylor - L'incoerenza potrebbe essere causata da '.val' o interruzioni di riga di jQuery. – karim79

0

Purtroppo, JavaScript non supporta nativamente la codifica o decodifica di entità HTML, che è ciò che dovrai fare per ottenere la lunghezza della stringa "reale". Sono stato in grado di trovare questa libreria di terze parti che è in grado di decodificare e codificare le entità HTML e sembra funzionare abbastanza bene, ma non c'è alcuna garanzia su come sarà completo.

http://www.strictly-software.com/htmlencode

3

Dal momento che non c'è soluzione utilizza jQuery ancora:

var str = 'lol&amp;'; 
alert($('<span />').html(str).text().length); // alerts 4 

utilizza lo stesso approccio come karim79, ma non è mai aggiunge l'elemento creato per il documento.

+2

Forse mi manca qualcosa ma la risposta di karim non aggiunge l'elemento al documento. –

+0

ok, sembra che abbia letto solo metà della sua risposta (o l'ha modificata) – ThiefMaster

1

Se si sta utilizzando javascript in un browser, suggerirei di utilizzarlo per aiutarvi. Puoi creare un elemento e impostare il suo innerHTML come stringa contenente entità HTML. Quindi estrai il contenuto di quell'elemento che hai appena creato come testo.

Ecco un esempio (utilizza Mootools): http://jsfiddle.net/mqchen/H73EV/

2

Si potrebbe per la maggior parte degli scopi per scontato che una e commerciale seguito da lettere, o una possibile '#' e numeri, seguiti da un punto e virgola, è un carattere.

var strlen=string.replace(/&#?[a-zA-Z0-9]+;/g,' ').length;