2009-09-30 16 views
39

Sto elaborando xhtml utilizzando javascript. Sto ottenendo il contenuto del testo per un nodo div concatenando il valore nodeValue di tutti i nodi figlio dove nodeType == Node.TEXT_NODE.Sostituzione   da javascript dom text node

La stringa risultante a volte contiene un'entità spazio non interruzione. Come posso sostituirlo con un carattere di spazio regolare?

mio div si presenta così ...

<div><b>Expires On</b> Sep 30, 2009 06:30&nbsp;AM</div>

I seguenti suggerimenti sul web non ha funzionato:

var cleanText = text.replace(/^\xa0*([^\xa0]*)\xa0*$/g,""); 


var cleanText = replaceHtmlEntities(text); 

var replaceHtmlEntites = (function() { 
    var translate_re = /&(nbsp|amp|quot|lt|gt);/g; 
    var translate = { 
    "nbsp": " ", 
    "amp" : "&", 
    "quot": "\"", 
    "lt" : "<", 
    "gt" : ">" 
    }; 
    return function(s) { 
    return (s.replace(translate_re, function(match, entity) { 
     return translate[entity]; 
    })); 
    } 
})(); 

qualche suggerimento?

+1

"' '&nnbsp;" I vostri dati non è il problema ... è vero? – brianreavis

+0

ho inserito il refuso nel mio post - Stack Overflow stava convertendo l'entità in uno spazio reale nell'anteprima del post se ho usato   – user158678

+0

Ehi, sembra un errore di battitura nel nome della funzione. Vedi la modifica alla mia domanda. – Kip

risposta

90

Questo è molto più facile di quello che stai facendo. Il nodo di testo non avrà la stringa letterale "&nbsp;" in esso, si avrà hanno il carattere corrispondente con il codice 160.

function replaceNbsps(str) { 
    var re = new RegExp(String.fromCharCode(160), "g"); 
    return str.replace(re, " "); 
} 

textNode.nodeValue = replaceNbsps(textNode.nodeValue); 

UPDATE

Ancora più facile:

textNode.nodeValue = textNode.nodeValue.replace(/\u00a0/g, " "); 
+1

grazie tim. questo ha funzionato e ha dimostrato di essere più facile di quanto lo stavo facendo :) – user158678

+0

Superbo - evviva la punta. –

+0

mi ha totalmente aiutato con qualcosa, grazie. –

4

Io penso quando si definisce una funzione con "var foo = function() {...};", la funzione è definita solo dopo quella linea. In altre parole, provate questo:

var replaceHtmlEntites = (function() { 
    var translate_re = /&(nbsp|amp|quot|lt|gt);/g; 
    var translate = { 
    "nbsp": " ", 
    "amp" : "&", 
    "quot": "\"", 
    "lt" : "<", 
    "gt" : ">" 
    }; 
    return function(s) { 
    return (s.replace(translate_re, function(match, entity) { 
     return translate[entity]; 
    })); 
    } 
})(); 

var cleanText = text.replace(/^\xa0*([^\xa0]*)\xa0*$/g,""); 
cleanText = replaceHtmlEntities(text); 

Edit: Inoltre, utilizzare solo "var" la prima volta che si dichiara una variabile (si sta utilizzando due volte sulla variabile cleanText).

Modifica 2: il problema è l'ortografia del nome della funzione. Hai "var replaceHtml Entites =". Dovrebbe essere "var replaceHtml Entit i es ="

+0

Sì, nel mio script ho la funzione prima del luogo in cui lo uso. Ho semplicemente dimenticato di farlo in quel modo quando ho postato qui. Ma non ha funzionato. – user158678

21

Se avete solo bisogno di sostituire &nbsp; quindi è possibile utilizzare una regex molto più semplice:

var textWithNBSpaceReplaced = originalText.replace(/&nbsp;/g, ' ');

Inoltre, v'è un errore di battitura nel tuo esempio div, si dice &nnbsp; anziché &nbsp;.

+0

Come interagisce con le stringhe di caratteri   nei blocchi CDATA (poiché questo è XHTML)? – cletus

+0

In realtà non copre questo caso. Se c'è bisogno di andare così lontano, una regex è probabilmente la soluzione sbagliata. – bobbymcr

+0

ho inserito l'errore nel mio post - Stack Overflow stava convertendo l'entità in uno spazio reale nell'anteprima del post se ho usato   – user158678

2

Quello la prima riga è piuttosto incasinata. Deve solo essere:

var cleanText = text.replace(/\xA0/g,' '); 

Questo dovrebbe essere tutto ciò che serve.

+0

Grazie - anche questo ha funzionato! – user158678

4

ho usato questo, e ha funzionato:

var cleanText = text.replace(/&amp;nbsp;/g,""); 
+1

questo funziona per me. : D grazie –

+0

Grazie. Questo è l'unico che funziona per me. –

4
var text = "&quot;&nbsp;&amp;&lt;&gt;"; 
text = text.replaceHtmlEntites(); 

String.prototype.replaceHtmlEntites = function() { 
var s = this; 
var translate_re = /&(nbsp|amp|quot|lt|gt);/g; 
var translate = {"nbsp": " ","amp" : "&","quot": "\"","lt" : "<","gt" : ">"}; 
return (s.replace(translate_re, function(match, entity) { 
    return translate[entity]; 
})); 
}; 

provare questo .....questo ha funzionato per me

1

Rimuove tutto tra & e ; che tutti questi simboli hanno. se hai voglia di liberartene.

text.replace(/&.*;/g,''); 
0

per me sostituire non funziona ... provare questo codice:

str = str.split("&quot;").join('"'); 
Problemi correlati